簡體   English   中英

SHA512在PHP中生成隨機數

[英]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%。

rand()mt_rand()都不會生成真正的隨機值。

如手冊所述:

此函數不會生成加密安全值,也不應用於加密目的。 如果您需要加密安全值,請考慮使用openssl_random_pseudo_bytes()

請參閱更好的隨機生成PHP以獲取StackOverflow問題,該問題指出了同樣的問題,並且有一些很好的答案。

你經常得1-6,因為你從哈希中獲取兩個十六進制數字。 這是一個字節,因此它可以存儲0255值。 然后你使用modulo 50 在結果你得到的范圍0-4950-99100-149150-199200-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM