[英]SHA512 to generate random numbers in PHP
我使用$blockhash[$i] = rand().time().rand()
用隨機數填充數組
然后,對於該數組中的每個隨機數,我計算對應的SHA512
$SecretKey = "60674ccb549f1988439774adb82ff187e63a2dfd403a0dee852e4e4eab75a0b3";
$sha = hash_hmac('sha512', $value, $SecretKey);
拆分它:
$pool = str_split($sha, 2);
然后我從$ pool數組中獲取第一個數字,將hex轉換為dec並將其限制在1和50之間:
$dec = hexdec($pool[0]) % 50 + 1;
問題是數字不是隨機的,我不知道為什么。 我正在計算從1到50的每個數字的頻率,但1,2,3,4,5和6的數字經常比其他數字上升。 見圖
為什么會發生這種情況以及如何解決? 謝謝!
您要轉換為十進制的2個十六進制字符將在0-255范圍內。 你修改了50並且添加1使得1-6(范圍(0-5)+1)在1-256上發生6次而其他每個數字僅發生5次。 這將導致這些數字增加約20%。
如手冊所述:
此函數不會生成加密安全值,也不應用於加密目的。 如果您需要加密安全值,請考慮使用
openssl_random_pseudo_bytes()
。
請參閱更好的隨機生成PHP以獲取StackOverflow問題,該問題指出了同樣的問題,並且有一些很好的答案。
你經常得1-6,因為你從哈希中獲取兩個十六進制數字。 這是一個字節,因此它可以存儲0
到255
值。 然后你使用modulo 50
。 在結果你得到的范圍0-49
, 50-99
, 100-149
, 150-199
, 200-249
和... 250-255
。 最后一個是您的結果中1-6的額外流行負責。
解決方案:只需使用mt_rand(1,50);
[編輯]
如果您確實需要將0-255范圍內的數字轉換為1-50范圍,則解決方案將是縮放和舍入。
$number = round(($byteValue)/(255/49))+1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.