2009-11-22 18 views
11

¿Cuál es la forma más eficiente de convertir un hash md5 en un entero único para realizar una operación de módulo?Convertir cadena md5 de 32 caracteres en entero

+0

¿Quieres hacer hash% x o x% hash? En el primer caso, es posible que ni siquiera necesite todo el hash para calcular la respuesta. – Joren

+0

Estoy buscando hash% X – ensnare

+0

¿Alguna de estas respuestas ha sido útil o aún necesita más información? –

Respuesta

23

Como el idioma de la solución no se especificó, Python se usa para este ejemplo.

import os 
import hashlib 

array = os.urandom(1 << 20) 
md5 = hashlib.md5() 
md5.update(array) 
digest = md5.hexdigest() 
number = int(digest, 16) 

print(number % YOUR_NUMBER) 
+0

Un md5 es 128 bits de información. Un python int generalmente va a ser de 32 o 64 bits de información, por lo que convertirlo a un int arrojará datos, ¿no es así? Creo que necesitas usar mucho tiempo. – elhefe

+4

Bah, no importa, int() devolverá un largo si es necesario. – elhefe

+0

¿Por qué lo convierte a la base 16? ¿Es esa la convención? – Nate

2

Hay más datos en un MD5 que caben incluso en un número entero de 64b, por lo que no hay forma (sin saber qué plataforma está utilizando) de obtener un número entero único. Puedes obtener uno único convirtiendo la versión hexadecimal en varios enteros que valen datos y luego combinándolos (suma o multiplicación). Sin embargo, la forma exacta en que lo haría dependerá del idioma que use.

Una gran cantidad de lenguaje del pondrá en práctica ya sea una función o unpacksscanf, que son buenos lugares para empezar a buscar.

+2

Usted está asumiendo que "entero" está limitado a 64 bits. ¿Qué hay de BigInteger? –

+1

Por supuesto, pero muchas plataformas no tienen números enteros de longitud arbitraria. Depende totalmente de la plataforma en la que se encuentre si hay una implementación BigInteger (nativa). –

+2

Absolutamente, pero "depende de su plataforma" no es lo mismo que "no hay forma" :) –

3

No ha dicho en qué plataforma se está ejecutando, ni cuál es el formato de este hash. Es de suponer que es hexadecimal, por lo que tienes 16 bytes de información.

Para convertir eso a entero único entero, básicamente necesita un tipo entero de 16 bytes (128 bits). Muchas plataformas no tienen ese tipo disponible de forma nativa, pero puede usar dos valores long en C# o Java, o BigInteger en Java o .NET 4.0.

Conceptualmente necesita analizar la cadena hexadecimal en bytes, y luego convertir los bytes en un número entero (o dos). La forma más eficiente de hacerlo dependerá por completo de la plataforma que esté utilizando.

+0

Gracias. ¿Cómo podría hacerse esto en php? – ensnare

+1

Usted estaría viendo sscanf en PHP: http://au.php.net/manual/en/function.sscanf.php –

+0

Excepto que a sscanf no parece gustarle el formato '% x', a menos que sea solo yo ... –

0

Deberá definir su propia función hash que convierta una cadena MD5 en un número entero del ancho deseado. Si quiere interpretar el hash MD5 como una cadena simple, puede probar el algoritmo FNV. Es bastante rápido y bastante uniformemente distribuido.

2

Si todo lo que necesita es módulo, realmente no necesita convertirlo a un entero de 128 bytes. Puede ir dígito por dígito o byte por byte, así.

mod=0 
for(i=0;i<32;i++) 
{ 
    digit=md5[i]; //I presume you can convert chart to digit yourself. 
    mod=(mod*16+digit) % divider; 
} 
Cuestiones relacionadas