【发布时间】:2009-11-22 20:27:18
【问题描述】:
将 md5 哈希转换为唯一整数以执行取模运算的最有效方法是什么?
【问题讨论】:
-
你想做 hash % x 还是 x % hash?在第一种情况下,您甚至可能不需要整个哈希来计算答案。
-
我正在寻找哈希 % X
-
这些答案是否有帮助或者您还需要更多见解?
将 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 将它返回的字符串转换为数字同样容易。
hexdigest 与 int,而是更多以 16 为基数,而不是以 10 为基数或以 2 为基数。我尝试了几个不同的选项,似乎哈希会转换为基数为 16 或更高的整数,但我真的不明白为什么。
你还没有说你在什么平台上运行,或者这个哈希的格式是什么。大概是十六进制,所以你有 16 个字节的信息。
为了将其转换为 唯一 整数,您基本上需要一个 16 字节(128 位)整数类型。许多平台本身没有这种类型,但您可以在 C# 或 Java 中使用两个 long 值,或者在 Java 或 .NET 4.0 中使用一个 BigInteger。
从概念上讲,您需要将十六进制字符串解析为字节,然后将字节转换为整数(或两个)。最有效的方法完全取决于您使用的平台。
【讨论】:
MD5 中的数据比 64b 整数还要多,因此无法(不知道您使用的平台)获得唯一整数。您可以通过将十六进制版本转换为几个整数值的数据,然后将它们组合(加法或乘法)来获得一个有点独特的数据。不过,您将如何处理这取决于您使用的语言。
许多语言将实现unpack 或sscanf 函数,这是开始寻找的好地方。
【讨论】:
如果您只需要模数,则实际上不需要将其转换为 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;
}
【讨论】:
您需要定义自己的哈希函数,将 MD5 字符串转换为所需宽度的整数。如果您想将 MD5 哈希解释为纯字符串,可以尝试 FNV 算法。它非常快速且分布相当均匀。
【讨论】: