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

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

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

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

в) всплывающим результатом будет целое число от 1 до 10000.

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

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

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

возможно ли что-то подобное?

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

если у вас есть ответ, не стесняйтесь опубликовать только общую идею, или, если вы того пожелаете, сниппет php тоже работает

спасибо!

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Поскольку 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).

0 голосов
/ 05 сентября 2011

, поскольку нужный диапазон всегда будет начинаться с 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;

?>

наслаждайтесь!

...