如何从SHA256哈希创建一个随机数?

时间:2012-11-20 09:00:11

标签: php

早上好,

我必须使用密钥从给定的256HASH创建一个随机数。一切都很好,直到我必须将哈希“转换”为0到15.000.000之间的整数(这是随机数)。我一直在玩ord()和bytes,但我没有得到任何适合我的东西。

我最初的想法是将SHA256字符串转换为整数,然后应用除数来获得模数。但我需要一个非常大的范围之间的随机数。 0到15.000.000(一千五百万)。你会怎么做?

谢谢!

1 个答案:

答案 0 :(得分:4)

哈希我基本上是一个数字,只有16的基数。话虽如此,你只需要将它转换为int。

问题是,当您将哈希转换为int时,如下所示:

echo intval(hash('sha256','asdf'),16);

对于32位系统,您将始终获得2147483647,这是intval的最大值。

我的建议是将哈希的值减少到几个第一个字符,如此

 echo intval(substr(hash('sha256','bsbaf'),0,6),16);

这是随机数的种子,你可以通过以下方式得到随机数:

 $hash = hash('sha256','bsbaf');
 $seed = intval(substr($hash,0,6),16);
 mt_srand($seed);
 echo mt_rand(0,15000000);

请注意,在某些情况下,您可能会发生冲突,因为您只使用哈希的前6个字符,但对于大多数情况,这不会有问题。由您不知道具体的用例,由您决定是否可以接受。

更新:另一种方法是从结果种子中制作模数 - 就像这样:

 $hash = hash('sha256','bsbaf');
 $seed = intval(substr($hash,0,6),16);
 echo $seed % 15000000;