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