Мне нужно получить «случайное» число (0-9) на основе строки, чтобы его можно было воссоздать. Мое решение состояло в том, чтобы использовать SHA512 и взять 2-ое число, как это:
$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%
Мне нужно знать, безопасно ли использовать этот метод, хотя результат кажется довольно точным.
Криптографически безопасные хеш-функции (а «S» в SHA означает «безопасный») обладают тем свойством, что их выходные данные практически неотличимы от случайных выходных данных. Изменение одного бита на входе должно в среднем переворачивать половину выходных битов таким образом, который выглядит совершенно случайным. Все, что меньше, может привести к уязвимости. Таким образом, вам почти гарантировано равномерное распределение. Но — что вы подразумеваете под «безопасным»? Не зная о том, что, во всяком случае, вы пытаетесь обезопасить, невозможно ответить на вопрос «Мне нужно знать, безопасно ли использовать этот метод». Как правило, если вы действительно должны спросить, то ответ, вероятно, «нет».
Других решений пока нет …