4

早上好,

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

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

谢谢!

4

1 回答 1

4

哈希 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;
于 2012-11-20T09:12:00.580 回答