如何以最有效的方式将MD5哈希转换为唯一整数并执行模操作?
由于没有指定解决方案语言,因此本例使用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)
hexdigest
方法很方便使用。通过调用 int
函数,将其返回的字符串转换为数字同样也很容易实现。 - Noctis Skytowerhexdigest
与 int
的区别,而是关于基数16与基数10或基数2之类的问题。我尝试了几种不同的选项,似乎哈希值将转换为一个以16为底或更高的整数,但我并不真正理解为什么会这样。 - Nate您没有说明运行的平台以及哈希值的格式。可能是十六进制,因此您有16个字节的信息。
为了将其转换为一个唯一的整数,您基本上需要一个16字节(128位)的整数类型。许多平台没有这样的类型可用,但在C#或Java中可以使用两个长整型
值,或在Java或.NET 4.0中使用BigInteger
。
从概念上讲,您需要将十六进制字符串解析为字节,然后将字节转换为整数(或两个整数)。最有效的方法完全取决于您使用的平台。
MD5中的数据量超过了一个64位整数所能容纳的范围,因此没有办法(除非知道您使用的平台)获得唯一的整数。您可以通过将十六进制版本转换为几个整数的数据,然后将它们组合起来(加法或乘法)来获得相对唯一的整数。如何进行这样的操作取决于您使用的语言。
许多编程语言都会实现unpack
或sscanf
函数,这是一个很好的起点。
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;
}