Php 将md5(或其他哈希方法?)转换为整数的算法,其中可以设置可能的结果整数范围(例如:1-10000)?
这个主题描述了我们想要实现的目标 a) 从可能的整数范围开始,例如1到10000 b) 取任何md5散列,通过这个算法运行它 c) 弹出的结果将是1到10000之间的整数 我们也愿意使用另一种散列方法 理想情况下,流程如下所示:Php 将md5(或其他哈希方法?)转换为整数的算法,其中可以设置可能的结果整数范围(例如:1-10000)?,php,algorithm,hash,md5,range,Php,Algorithm,Hash,Md5,Range,这个主题描述了我们想要实现的目标 a) 从可能的整数范围开始,例如1到10000 b) 取任何md5散列,通过这个算法运行它 c) 弹出的结果将是1到10000之间的整数 我们也愿意使用另一种散列方法 理想情况下,流程如下所示: string -> md5(string) -> algo(md5(string),range) -> resulting integer within range 这样的事情可能吗 最后注意:范围始终以1开始 如果您有答案,请随意发布大概的想法,或
string -> md5(string) -> algo(md5(string),range) -> resulting integer within range
这样的事情可能吗
最后注意:范围始终以1开始
如果您有答案,请随意发布大概的想法,或者如果您愿意,php代码片段也可以:)
谢谢 由于MD5(和SHA-1等)将给您128位数据(在PHP中,您将以十六进制字符串表示法获取数据,因此需要先将其转换为整数)。以10000为模的那个数就是整数
但是请注意,许多不同的散列将转换为相同的整数;这对于整数范围的任何类型的转换都是不可避免的,因为模运算本质上是将一组较大的数字(在本例中为128位,即从0到340282366920938463463374607431768211456的数字)映射到一组较小的数字(小于17位,从1到100000的数字).因为我们想要的范围总是从1开始,所以下面的方法非常有效。所有的功劳都归于Piskvor,因为他提供了如何进行这项工作的基本想法 下面的代码可以实现我们想要的。请插话,如果这可以(不是代码,它只是供参考,但如果想法)在所有改进。运行下面的代码将产生6305/10000唯一结果。这在我们的情况下已经足够好了
<?
$final=array();
$range=10000;
for($i=1;$i<=$range;$i++){
$string='this is my test string - attempt #'.$i;
echo 'initial string: '.$string.PHP_EOL;
$crc32=crc32($string);
echo 'crc32 of string: '.$crc32.PHP_EOL;
$postalgo=$crc32%$range;
echo 'post algo: '.$postalgo.PHP_EOL;
if(!in_array($postalgo,$final)){
$final[]=$postalgo;
}
}
echo 'unique results for '.($i-1).' attempts: '.count($final).PHP_EOL;
?>
享受吧 我不确定,但似乎这就是你想要的:?或者,嗯,你只想将散列转换为特定范围内的整数?如果你要将散列转换为10K范围,那么加密散列就太过了。它提供的实际保证(无碰撞)完全被小范围破坏。您最好使用更快的散列,以保持合理的排列。crc32有几个命令行和库实现。是的,我们最终使用了crc32。越独特越好,但有些重叠是可以的。MD5不会生成十六进制数字-常用的实现默认情况下只是这样格式化。@Nick Johnson:好的,它会返回一个128位的整数,通常用十六进制格式化。编辑,现在好点了吗?:)@实际上,它给你8字节的数据;将其解释为整数只是一个选项。:)@尼克·约翰逊:那么,我们能就128位的数据达成一致吗?仅仅通过100000次尝试,它就产生了63070个uniques。出于好奇,有人想插嘴为什么6305换10000,63070换100000?这不是唯一值的计数。您计算出没有出现3695个值。对于10000只鸽子和6305个洞,至少有些洞有多只鸽子,至少有些值不是唯一的。使用
final[$postalgo]++
和对所有i if(final[i]==1)count++
进行唯一计数。我的意思是10000个值中会出现6305个,你是对的。这是我们最重要的。是的,我知道/理解如何计算重复项。