2009-08-25 17 views
12

Estoy buscando hacer una cadena pero necesito que la salida sea un número entero, así que no puedo hacer md5. ¿La gente de aquí tiene cualquier hash numérico favorito con el que puedan querer iluminarme? Estoy usando PHP.Buenos hashes numéricos

Gracias!

+0

¿Quieres decir una "buena" de hash como en buena seguridad o como en buena distribución de claves ? El primero generalmente le dará el segundo, pero a un costo comparativamente alto. – RBarryYoung

+17

La siguiente página tiene varias implementaciones de funciones hash de propósito general que son eficientes y exhiben colisiones mínimas: http://partow.net/programming/hashfunctions/index.html –

Respuesta

3

Tal vez esto es lo suficientemente bueno para usted:

echo sprintf('%u', crc32($string)); 

EDITAR: Otra alternativa similar,

echo hash('adler32', $string); 
4

La salida de MD5 es un número, al igual que con casi todos los de hash imaginables . Es solo un número que generalmente se expresa en hexadecimal. Utilice cualquier algoritmo hash que esté convenientemente disponible para usted, corte tantos bits como desee del final y trate esos bits como un número. Cualquier buen hash tendrá su último (o primer, o medio) n bits distribuidos tan equitativamente como el valor completo.

+3

Sí, pero truncar o doblar el resultado de hash lo hará calidad suelta tanto en términos de seguridad y distribución. – nik

+2

Si el hash es bueno (si es una aproximación adecuada a un hash ideal), cuando lo trunque se mantendrá igual de bien distribuido, y no perderá ninguna seguridad excepto lo que se debe al reducido espacio de teclas. – hobbs

0

Puede utilizar base_convert cambiar hexadecimal en número decimal y viceversa. Si quieres convertir números enteros (como una cadena) a hexadecimal, estás limitado a números de 32 bits o menos que yo creo (PHP_INT_MAX).

php -r 'foreach (hash_algos() as $hash) { echo $hash, "\n", $a = hash($hash, "test"), "\n", $b = base_convert($a, 16, 10), "\n", $c = base_convert($b, 10, 16), "\n", ($c === $a ? "yes" : "no"), "\n\n"; }' > hashes.txt 

de las claves disponibles que tenía, estos son los que pude convertir entre decimal y hexadecimal:

adler32 
c1015d04 
3238092036 
c1015d04 
yes 

crc32 
accf8b33 
2899282739 
accf8b33 
yes 

crc32b 
d87f7e0c 
3632233996 
d87f7e0c 
yes