Преобразование 32- char строка md5 в целое число

Каков наиболее эффективный способ преобразования хеша md5 в уникальное целое число для выполнения операции модуля?

Ответ 1

Поскольку язык решения не указан, в этом примере используется Python.

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)

Ответ 2

Вы не сказали, на какой платформе вы работаете, или в каком формате этот хеш. Предположительно, он шестнадцатеричный, поэтому у вас есть 16 байт информации.

Чтобы преобразовать это в уникальное целое число, вам в основном нужен 16-байтовый (128-разрядный) целочисленный тип. На многих платформах такого типа нет, но вы можете использовать два значения long в С# или Java или BigInteger в Java или .NET 4.0.

Концептуально вам нужно проанализировать шестнадцатеричную строку в байтах, а затем преобразовать байты в целое (или два). Самый эффективный способ сделать это будет полностью зависеть от того, какую платформу вы используете.

Ответ 3

В MD5 есть больше данных, чем будет соответствовать даже целому числу 64b, поэтому нет способа (не зная, какую платформу вы используете), чтобы получить уникальное целое число. Вы можете получить несколько уникальную возможность, конвертируя шестнадцатеричную версию в несколько целых чисел, а затем объединяете их (добавление или умножение). Как именно вы это решаете, это зависит от того, какой язык вы используете.

В любом случае язык будет реализовывать либо функцию unpack, либо sscanf, которые являются хорошими местами для начала поиска.

Ответ 4

Если вам нужен модуль, вам фактически не нужно преобразовывать его в 128-байтовое целое. Вы можете перейти по цифре или по байтам, как это.

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;
}

Ответ 5

Вам нужно будет определить собственную хэш-функцию, которая преобразует строку MD5 в целое число требуемой ширины. Если вы хотите интерпретировать хеш MD5 как обычную строку, вы можете попробовать алгоритм FNV. Это довольно быстро и довольно равномерно распределено.