алгоритм для преобразования md5 (или, может быть, другой метод хэширования?) в целое число, где можно установить возможные результирующие целые диапазоны (например: 1-10000)?

тема в значительной степени описывает то, что мы хотели бы выполнить.

а) начать с возможного диапазона целых чисел, например от 1 до 10000.

б) возьмите любой тэг md5, запустите его через это альго.

c) результат, который выскочит, будет целым числом от 1 до 10000.

мы также открыты для использования другого метода хэширования.

поток идеально будет выглядеть так:

string -> md5(string) -> algo(md5(string),range) -> resulting integer within range 

что-то вроде этого возможно?

окончательное примечание: диапазон всегда начинается с 1.

если у вас есть ответ, не стесняйтесь публиковать только общую идею, или если вы этого хотите, PHP-фрагмент работает тоже 🙂

благодаря!

Поскольку MD5 (и SHA-1 и т. Д.) Даст вам 128 бит данных (в PHP вы получите его в шестнадцатеричной строковой нотации, поэтому сначала вам нужно преобразовать его в целое число). Это число по модулю 10000 даст вам целое число.

Обратите внимание, однако, что многие разные хеши будут конвертировать в одно и то же целое число; это неизбежно при любом преобразовании в ваш целочисленный диапазон, поскольку по modulo операция по существу отображает больший набор чисел (в этом случае 128 бит, то есть числа от 0 до 340,282,366,920,938,463,463,374,607,431,768,211,456) до меньшего набора чисел (менее 17 бит, цифры от 1 до 100 000).

так как диапазон, который мы хотим, всегда будет начинаться с 1, следующее отлично работает. весь кредит принадлежит Писворю, поскольку он был тем, кто представил основную идею о том, как это сделать.

код ниже швов, чтобы выполнить то, что мы хотим. пожалуйста, звоните, если это может быть (а не код, его только для справки, но если идея) вообще улучшилась. запуск кода ниже приведет к уникальным результатам 6305/10000. что в нашем случае достаточно.

 <? $final=array(); $range=10000; for($i=1;$i<=$range;$i++){ $string='this is my test string - attempt #'.$i; echo 'initial string: '.$string.PHP_EOL; $crc32=crc32($string); echo 'crc32 of string: '.$crc32.PHP_EOL; $postalgo=$crc32%$range; echo 'post algo: '.$postalgo.PHP_EOL; if(!in_array($postalgo,$final)){ $final[]=$postalgo; } } echo 'unique results for '.($i-1).' attempts: '.count($final).PHP_EOL; ?> 

наслаждаться!