将md5哈希转换为唯一整数以执行模数运算的最有效方法是什么?
答案 0 :(得分:26)
由于未指定解决方案语言,因此本例使用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)
答案 1 :(得分:3)
您还没有说过您正在运行的平台,或者此哈希的格式是什么。据推测它是十六进制的,所以你有16个字节的信息。
为了将其转换为唯一整数,您基本上需要一个16字节(128位)整数类型。许多平台本身没有这样的类型,但您可以在C#或Java中使用两个long
值,在Java或.NET 4.0中使用BigInteger
。
从概念上讲,您需要将十六进制字符串解析为字节,然后将字节转换为整数(或两个)。最有效的方法完全取决于您使用的平台。
答案 2 :(得分:2)
MD5中的数据甚至超过了64b整数,所以没有办法(不知道你使用的平台)获得一个唯一的整数。通过将十六进制版本转换为几个整数值的数据然后将它们组合(加法或乘法),您可以得到一个独特的版本。你究竟要怎么做取决于你使用的语言。
很多语言都会实现unpack
或sscanf
功能,这是开始寻找的好地方。
答案 3 :(得分:2)
如果您只需要模数,则实际上不需要将其转换为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;
}
答案 4 :(得分:0)
您需要定义自己的哈希函数,将MD5字符串转换为所需宽度的整数。如果要将MD5哈希解释为纯字符串,可以尝试FNV算法。它非常快速且分布均匀。