4

おはようございます、

秘密鍵を使用して、特定の 256HASH から乱数を作成する必要があります。ハッシュを 0 ~ 15.000.000 (乱数) の整数に「変換」する必要があるまでは、すべて問題ありません。ord() と bytes で遊んでいますが、自分に合ったものは何も得られません。

私の最初のアイデアは、SHA256 文字列を整数にキャストし、除数を適用してモジュラスを取得することでした。しかし、非常に大きな範囲の乱数が必要です。0 ~ 15.000.000 (1,500 万)。どのようにしますか?

ありがとう!

4

1 に答える 1

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;
于 2012-11-20T09:12:00.580 に答える