【问题标题】:Convert 32-char md5 string to integer将 32 字符 md5 字符串转换为整数
【发布时间】:2009-11-22 20:27:18
【问题描述】:

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

【问题讨论】:

  • 你想做 hash % x 还是 x % hash?在第一种情况下,您甚至可能不需要整个哈希来计算答案。
  • 我正在寻找哈希 % X
  • 这些答案是否有帮助或者您还需要更多见解?

标签: hash 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)

【讨论】:

  • 一个 md5 是 128 位的信息。 python int 通常是 32 位或 64 位的信息,因此转换为 int 会丢弃数据,不是吗...?我认为您需要使用 long。
  • 为什么要转换成base 16?这是约定吗?
  • @Nate hexdigest 方法使用起来很方便。通过调用int 将它返回的字符串转换为数字同样容易。
  • @NoctisSkytower 感谢您的回复 - 我不是在询问 hexdigestint,而是更多以 16 为基数,而不是以 10 为基数或以 2 为基数。我尝试了几个不同的选项,似乎哈希会转换为基数为 16 或更高的整数,但我真的不明白为什么。
  • @Nate 让我们谈谈计算机理论(对或错)。整数在计算机中存储为位(以 2 为基数)。但是,它们存储的基数并不像整数所代表的无基值那么重要。当您想查看一个整数时,您可以使用您想要的任何字符以您想要的任何基数显示它。在许多情况下,您可以忘记数字的基数而只考虑它的值。您如何表达该值取决于您考虑的基数或您想要显示它的基数,但数学的基本原理几乎可以在不考虑数字的基数的情况下工作。
【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:

MD5 中的数据比 64b 整数还要多,因此无法(不知道您使用的平台)获得唯一整数。您可以通过将十六进制版本转换为几个整数值的数据,然后将它们组合(加法或乘法)来获得一个有点独特的数据。不过,您将如何处理这取决于您使用的语言。

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

【讨论】:

  • 您假设“整数”限制为 64 位。 BigInteger 呢?
  • 当然,但是很多平台没有任意长度的整数。完全取决于您所在的平台是否有(本机)BigInteger 实现。
  • 当然可以,但是“这取决于你的平台”与“没有办法”是不一样的:)
【解决方案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 算法。它非常快速且分布相当均匀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多