php 中的可重新创建的随机数

Recreateable random number in php

我需要根据字符串得到一个 "random" 数字 (0-9),以便重新创建它。我的解决方案是使用 SHA512 并取第二个数字,如下所示:

$random = filter_var(hash('sha512', 'STRING COMES HERE'), FILTER_SANITIZE_NUMBER_INT)[1];

我想知道这是否准确且不可预测。我需要这个随机数来决定两个选项。我做了一个测试,看看这些数字是否给我一个 50/50 的比率。

$option1 = 0;
$option2 = 0;
$times = 1000000; // amount of iterations

for($i = 0; $i < $times; $i++) {
    $result = filter_var(hash('sha512', rand()), FILTER_SANITIZE_NUMBER_INT)[1];
    if($result < 5) {
        $option1++;
    }
    else {
        $option2++;
    }
}

echo "Option 1: ".($option1/$times * 100)."%";
echo "</p>Option 2: ".($option2/$times * 100)."%";

这就是结果

Option 1: 49.9207%

Option 2: 50.0793%

我需要知道使用这种方法是否安全,即使结果看起来相当准确。

加密安全散列函数(SHA 中的 "S" 代表 "Secure")具有 属性 其输出实际上与随机输出无法区分的特点。改变输入的一位平均应该以一种看起来完全随机的方式翻转一半的输出位。任何低于此的都会引入漏洞。因此,几乎可以保证您的分布是均匀的。但是 - "safe" 是什么意思?在不知道什么(如果有的话)的情况下,您试图防​​止它无法回答问题 "I need to know if it's safe to use this method"。作为一般经验法则——如果您真的必须问,那么答案可能是 "no".