【问题标题】:converting hash value(md5, sha1 etc..) to integer in a fixed range将哈希值(md5、sha1 等)转换为固定范围内的整数
【发布时间】:2015-11-23 22:55:21
【问题描述】:

假设我有一个哈希函数 md5,我对一些字符串进行哈希处理,它给了我一些值,我需要将其转换为具有固定范围的整数值。

这里给crc32() algorithm to convert md5 (or maybe another hashing method?) to integer where it is possible to set possible resulting integer ranges (eg: 1-10000)?

比如说:

$value=md5("dog");
echo $value;

Output: "06d80eb0c50b49a509b49f2424e8c805"`

现在我需要将此值转换为整数,以便在大小为 1000 的查找表中使用它。因此,当我转换它时,此哈希值的大小应该在 0 到 999 之间。我该怎么做那?

【问题讨论】:

  • 这将是一个有很多重叠的查找表,所以你不妨使用模/除法余数 ($crc % 1000)。
  • 如果我创建一个大型查找表说 1 亿个条目为 crc32() 不是一个好的选择,虽然你是正确的,但对于大量数据我需要使用 md5。

标签: php algorithm hash md5


【解决方案1】:

您可以使用 base_convert 将十六进制输出从 md5 更改为十进制,然后使用 bcmod 函数将其转换为您选择的范围内的数字:

<?php
$valuetohash = "dog";
$range = 1000;
$hashslot = bcmod(base_convert(md5($valuetohash), 16, 10), $range);
echo $hashslot;

输出:26

将“dog”改为“parrot”产生 800,将其改为“cat”产生 260(有趣的是,这表明猫比狗好 10 倍)。

注意,如果您使用的是不映射到“大十六进制数”的不同哈希,例如 crc32 映射到整数,则需要以不同方式执行上述操作(对于 crc32,您可以直接 %mod 到范围,例如,根据您问题的原始评论)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多