Каков алгоритм функции для перевода строки в уникальное число?

Здравствуйте.
Нужно сделать функцию, на вход которой дается строка, а на выходе получается число, которое всегда одно и то же для этой конкретной строки. Число должно лежать в диапазоне от 0 до PHP_INT_MAX.

Результаты должны распределяться равномерно. Например, если подавать на вход строковые представления чисел от 0 до PHP_INT_MAX, чтобы результаты функции в идеале повторялись как можно меньшее количество раз.

Например:
f('1') // 6484845
f('11') // 2156165
f('111') // 59544206


Была идея сделать так:
Брать первые 7 байт md5 от входной строки и переводить в 10 СС. Но, насколько я знаю, в результатах md5 не часто бывает так, чтобы подряд шло много нулей. В результате этого, числа, построенные по этому алгоритму будут иметь перекос в большую сторону, и почти не будет чисел, как мне кажется, ближе к 0.
  • Вопрос задан
  • 632 просмотра
Решения вопроса 3
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
sergiks
@sergiks Куратор тега PHP
♬♬
PHP_INT_MAX это обычно 31 бит (не меньше), поэтому можно взять функцию crc32(), например, и обрезать старший бит:
<?php
for($i=0; $i<=10; $i++) {
	echo "$i - " . f($i) . "\n";
}

function f($s) {
	return crc32($s) & 0x7FFFFFFF;
}
/*
0 - 1960566561
1 - 64810935
2 - 450215437
3 - 1842515611
4 - 1941314360
5 - 78719918
6 - 498629140
7 - 1790921346
8 - 2046842643
9 - 218589061
10 - 559752673
*/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы