Ciertamente, no es lo suficientemente seguro para una situación donde los valores de adivinación pueden revelar información.
Al menos algunas de las anulaciones ni siquiera son lo suficientemente seguras como para utilizarlas como un código hash en vista de una entrada arbitraria seleccionada por el usuario (es realmente fácil realizar un ataque hash-DoS contra cualquier cosa utilizando la anulación de String.hashCode()
de Java ).
En los casos en los que desee un identificador, recomiendo tomar un identificador simple (por ejemplo, una clave numérica en una base de datos, un entero incrementado de forma atómica que es una clave en una tabla hash, etc.) y luego agregar un hash criptográfico de eso y una sal.
Es decir, su ID expuesta públicamente sería de la forma (en lenguaje agnóstico):
Concatenate(PrivateID, HexString(SHA256(UTF8Bytes(Concatenate(Salt, PrivateID)))))
(Podrías eliminar parte del hash para obtener una ID más pequeña a costa del tiempo reducido para fuerza bruta).
Luego, la ID privada se puede obtener como una subcadena, y la ID completa se puede verificar nuevamente. El procedimiento general también es fácil de portar entre idiomas.
El puñado de ciclos de CPU que costará no va a tener un gran impacto en relación con el resto del sistema, a menos que su sistema sea tan trivial que no vaya a utilizar mucha CPU de todos modos, a menos que esté ejecutar esto en algo realmente de baja potencia (como en, mucho menos potente que un teléfono barato) no será una preocupación.
En los casos en los que realmente desea utilizar un código hash como un código hash y tiene que lidiar con la entrada seleccionada por el usuario, use un algoritmo hash que se pueda sembrar (por ejemplo, SpookyHash) y base su semilla en el tiempo de inicio ( o mejor aún, una combinación de tiempo de inicio y el momento en que se crea el contenedor de hash). (Nada que ver con los hash criptográficos, por lo que pueden ser mucho más rápidos; el único riesgo de seguridad que esto evita es el hash-DoSing).