¿Por qué no utiliza una variante long
del predeterminado String.hashCode()
(donde algunos chicos realmente inteligentes sin duda se esfuerzan para hacerlo eficiente, sin mencionar los miles de ojos de desarrollador que ya vieron este código)?
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
Si usted está buscando aún más bits, que probablemente podría utilizar una edición
BigInteger
:
Como ya he mencionado en un comentario a la respuesta de @brianegge, no hay muchos casos de uso de hashes con más de 32 bits y lo más probable es que no uno solo de los hashes con más de 64 bits:
que podía imaginar una enorme tabla hash distribuida a través de docenas de servidores, quizás almacenar decenas de miles de asignaciones. Para tal escenario, @brianegge todavía tiene un punto válido aquí: 32 bit permiten 2^32 (ca. 4.3 billones) diferentes claves hash. Suponiendo un algoritmo fuerte, aún debería tener muy pocas colisiones. Con 64 bit (18,446,744,073 billones de teclas diferentes) sin duda guardará, independientemente de cualquier escenario loco que lo necesite.Sin embargo, es casi imposible pensar en los casos de uso para llaves de 128 bits (340,282,366,920,938,463,463,374,607,431 mil millones de teclas posibles).
combinar el hash para varios campos, simplemente
hacer un XOR
multiplican uno con un primer y añadirlos:
long hash = MyHash.hash(string1) * 31 + MyHash.hash(string2);
El pequeño primo es allí para evitar código hash igual para los valores conmutadas , es decir, {'foo', 'bar'} y {'bar', 'foo'} no son iguales y deben tener un código hash diferente. XOR es malo, ya que devuelve 0 si ambos valores son iguales. Por lo tanto, {'foo', 'foo'} y {'bar', 'bar'} tendrían el mismo código hash.
El siguiente enlace tiene varias implementaciones de funciones generales propósito de hash que sean eficientes y exhiben colisiones mínimos: http://www.partow.net/programming/hashfunctions/index.html –