2010-04-24 11 views
6

Estoy buscando tomar un rango de hash (md5 o sha1) y dividirlo en n rangos iguales.Dividir todo el rango de hash en n rangos iguales

Por ejemplo, si m (nodos numéricos) = 5, todo el rango de hash se dividiría entre 5 para que haya una distribución uniforme de rangos de teclas. Me gustaría que n = 1 (nodo 1) sea desde el comienzo del rango de hash a 1/5, 2 de 1/5 a 2/5, etc. hasta el final.

Básicamente, necesito asignar rangos de teclas a cada n para que cuando tenga un valor, sepa qué n va a ocuparse de ese rango.

Soy nuevo en Hashing y estoy un poco seguro de dónde podría comenzar a resolver esto para un proyecto. Cualquier ayuda que puedas dar sería genial.

+0

Es confuso cómo se utiliza tanto n como el número de rangos a dividirse en, y como un índice para una de esas n partes – Joren

+0

Toda esta pregunta es confusa y supongo que lo que intenta hacer, sea lo que sea, es imposible porque las funciones hash criptográficas son efectivamente irreversibles. –

+0

Cambié la pregunta sobre cómo arreglar el uso ambiguo de ny tratar de explicar un poco más. – noxtion

Respuesta

1

Si puede soportar un poco de sesgo muy difícil de eliminar (cualquier potencia de dos es imposible de dividir uniformemente en 5, entonces tiene que haber algún sesgo), entonces módulo (% en C y muchos otros idiomas con C- como la sintaxis) es la forma de dividir el rango completo en 5 particiones de tamaño casi idéntico.

Cualquier mensaje m con md5(m)%5==0 está en la primera partición, etc.

0

Si usted está mirando para colocar un valor hash en una serie de "cubos" de manera uniforme, y luego un poco de matemática sencilla hará el truco. Tenga cuidado con las cajas de borde redondeado ... Sería mejor usar una potencia de 2 para el valor de CUBOS.

Este es el código Python, por cierto, que soporta grandes números enteros ...

BUCKETS = 5 
BITS  = 160 

BUCKETSIZE = 2**BITS/BUCKETS 

int('ad01c5b3de58a02a42367e33f5bdb182d5e7e164', 16)/BUCKETSIZE == 3 
int('553ae7da92f5505a92bbb8c9d47be76ab9f65bc2', 16)/BUCKETSIZE == 1 
int('001c7c8c5ff152f1cc8ed30421e02a898cfcfb23', 16)/BUCKETSIZE == 0 
Cuestiones relacionadas