Certamente non è abbastanza sicuro per una situazione in cui i valori di indovinare possono rivelare informazioni.
Almeno alcuni degli override non sono nemmeno abbastanza sicuri da usare come codice hash di fronte a un input arbitrario selezionato dall'utente (è davvero facile fare un attacco hash-DoS contro qualsiasi cosa usando l'override String.hashCode()
di Java ).
Nei casi in cui desideri un identificatore, ti consiglio di prendere un identificatore semplice (ad esempio una chiave numerica in un database, un numero intero incrementato a livello atomico che è una chiave in una tabella hash, ecc.) e quindi aggiungere un hash crittografico di tale e un sale.
Cioè, il tuo ID pubblicamente esposto sarebbe del modulo (in forma agnostica linguistica):
Concatenate(PrivateID, HexString(SHA256(UTF8Bytes(Concatenate(Salt, PrivateID)))))
(Potresti rimuovere parte dell'hash per un ID più piccolo al costo di tempo ridotto alla forza bruta).
Quindi l'ID privato può essere ottenuto come sottostringa e l'ID completo può essere nuovamente verificato. La procedura generale è anche facilmente trasferibile tra le lingue.
La manciata di cicli della CPU che costerà non avrà un grosso impatto sul resto del sistema, a meno che il tuo sistema sia così banale che non utilizzerai comunque molta CPU, quindi a meno che tu non sia eseguendo questo su qualcosa di veramente basso potere (come in, molto meno potente di un telefono economico) non sarà una preoccupazione.
Nei casi in cui in realtà si desidera utilizzare un codice hash come codice hash e gestire l'input selezionato dall'utente, quindi utilizzare un algoritmo hash seedable (ad esempio SpookyHash) e basare il seed in fase di avvio ( o meglio ancora, un mix di tempo di avvio e il tempo di creazione del contenitore hash). (Nulla da fare con gli hash crittografici, quindi possono essere molto più veloci, il rischio di sicurezza solo che questo evita è hash-DoSing).