Hash 将32字符md5字符串转换为整数

Hash 将32字符md5字符串转换为整数,hash,md5,Hash,Md5,将md5散列转换为唯一整数以执行模运算的最有效方法是什么?md5中的数据量甚至超过64b整数的数据量,因此无法(不知道您使用的平台)获得唯一整数。通过将十六进制版本转换为数个整数值的数据,然后将它们组合(加法或乘法),可以得到一个有点独特的十六进制版本。你到底会怎么做,这取决于你使用的是什么语言 许多语言将实现解包或sscanf函数,这是开始寻找的好地方。您还没有说您在哪个平台上运行,或者这个散列的格式是什么。大概是十六进制,所以你有16字节的信息 为了将其转换为唯一的整数,基本上需要一个16字

将md5散列转换为唯一整数以执行模运算的最有效方法是什么?

md5中的数据量甚至超过64b整数的数据量,因此无法(不知道您使用的平台)获得唯一整数。通过将十六进制版本转换为数个整数值的数据,然后将它们组合(加法或乘法),可以得到一个有点独特的十六进制版本。你到底会怎么做,这取决于你使用的是什么语言


许多语言将实现
解包
sscanf
函数,这是开始寻找的好地方。

您还没有说您在哪个平台上运行,或者这个散列的格式是什么。大概是十六进制,所以你有16字节的信息

为了将其转换为唯一的整数,基本上需要一个16字节(128位)的整数类型。许多平台本机没有这样的类型,但您可以在C#或Java中使用两个
long
值,或者在Java或.NET 4.0中使用
biginger


从概念上讲,您需要将十六进制字符串解析为字节,然后将字节转换为整数(或两个)。最有效的方法完全取决于您使用的平台。

您需要定义自己的哈希函数,将MD5字符串转换为所需宽度的整数。如果要将MD5哈希解释为普通字符串,可以尝试该算法。它非常快速且分布相当均匀。

由于未指定解决方案语言,因此本例使用Python

导入操作系统
导入hashlib

array=os.uradom(1如果您只需要模数,那么实际上不需要将其转换为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;
}
mod=0

对于(i=0;i您假设“integer”限制为64位。BigInteger呢?当然,但很多平台都没有任意长度的整数。这完全取决于您所在的平台是否有(本机)BigInteger实现。当然,但“它取决于您的平台”与“没有办法”不同:你会在PHP中看到sscanf:你想做散列%x还是x%散列?在第一种情况下,你可能甚至不需要整个散列来计算答案。我在寻找散列%x这些答案中有没有有用的,或者你还需要更深入的了解?md5是128位的信息。python int通常是32或64位的信息假设,转换为整数会丢弃数据,不是吗…?我想你需要使用long。为什么要将它转换为基数16?这是惯例吗?@Nate
hexdigest
方法使用起来很方便。调用
int
@noctiskytower同样容易将它返回的字符串转换为数字,谢谢回答-我不是问hexdigest
vs
int
,而是问更多的以16为基数,而不是以10为基数或以2为基数。我尝试了几个不同的选项,看起来散列将转换为以16为基数或更高的整数,但我真的不明白为什么。@Nate让我们谈谈计算机理论(对还是错).整数作为位存储在计算机中(基数2)。但是,它们存储的基数与整数表示的无基数值没有多大关系。当您想查看整数时,可以使用任何字符以任意基数显示它。在许多情况下,您可以忘记数字的基数,只考虑其值。如何表示该值取决于基数你想在或你想显示它的基数,但数学的基本原理基本上只是工作,而不考虑数字的基数。