早上好,
我必须使用密钥从给定的256HASH创建一个随机数。一切都很好,直到我必须将哈希“转换”为0到15.000.000之间的整数(这是随机数)。我一直在玩ord()和bytes,但我没有得到任何适合我的东西。
我最初的想法是将SHA256字符串转换为整数,然后应用除数来获得模数。但我需要一个非常大的范围之间的随机数。 0到15.000.000(一千五百万)。你会怎么做?
谢谢!
答案 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;