将散列值(md5、sha1 等)转换为固定范围内的整数
converting hash value(md5, sha1 etc..) to integer in a fixed range
假设我有一个哈希函数 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 的查找 table 中使用它。因此,当我转换它时,该散列值的大小应介于 0 到999. How can I do that? 我该怎么做?
您可以使用 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 倍).
请注意,如果您使用的是不映射到 "a big hex number" 的不同哈希值,例如 crc32 映射到一个整数,您将需要以不同的方式执行上述操作(对于 crc32,您可以例如,根据对您问题的原始评论,直接将 %mod 设为范围。
假设我有一个哈希函数 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 的查找 table 中使用它。因此,当我转换它时,该散列值的大小应介于 0 到999. How can I do that? 我该怎么做?
您可以使用 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 倍).
请注意,如果您使用的是不映射到 "a big hex number" 的不同哈希值,例如 crc32 映射到一个整数,您将需要以不同的方式执行上述操作(对于 crc32,您可以例如,根据对您问题的原始评论,直接将 %mod 设为范围。