Вот краткая демонстрация того, как вы можете это сделать.
function getOneToTenHash($str) {
$hash = hash('sha256', $str, true);
$unpacked = unpack("L", $hash); // convert first 4 bytes of hash to 32-bit unsigned int
$val = $unpacked[1];
return ($val % 10) + 1; // get 1 - 10 value
}
for ($i = 0; $i < 100; $i++) {
echo getOneToTenHash('str' . $i) . "\n";
}
Как это работает :
В основном вы получаете выходные данные хеш-функции и уменьшаете еедо желаемого диапазона (в данном случае 1..10).
В приведенном выше примере я использовал хэш-функцию sha256
, которая возвращает 32 байта произвольных двоичных данных. Затем я извлекаю только первые 4 байта как целочисленное значение (unpack()
). На данный момент у меня есть 4-байтовое целочисленное значение (диапазон 0..4294967295). Чтобы уменьшить его до диапазона 1..10, я просто беру остаток от деления на 10 (0..9) и добавляю 1. Это не единственный способ уменьшить диапазон, но простой.
Итак, приведенный выше пример состоит из 3 шагов:
- получить значение хеша
- преобразовать значение хеша в целое число
- целочисленный диапазон уменьшения до нуля
Гораздо более короткий пример с функцией crc32()
, которая сразу возвращает целочисленное значение, что позволяет нам пропустить шаг 2:
function getOneToTenHash($str) {
$int = crc32($str); // 0..4294967295
return ($int % 10) + 1; // 1..10
}