Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将md5(或其他哈希方法?)转换为整数的算法,其中可以设置可能的结果整数范围(例如:1-10000)?_Php_Algorithm_Hash_Md5_Range - Fatal编程技术网

Php 将md5(或其他哈希方法?)转换为整数的算法,其中可以设置可能的结果整数范围(例如: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开始 如果您有答案,请随意发布大概的想法,或

这个主题描述了我们想要实现的目标

a) 从可能的整数范围开始,例如1到10000

b) 取任何md5散列,通过这个算法运行它

c) 弹出的结果将是1到10000之间的整数

我们也愿意使用另一种散列方法

理想情况下,流程如下所示:

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个,你是对的。这是我们最重要的。是的,我知道/理解如何计算重复项。