2014-09-18 3 views
-4

Возможно ли генерировать псевдослучайное число на основе строки, что означает, что конкретная строка ВСЕГДА вернет тот же номер?Как создать случайное число на основе строки?

+2

Ну, тогда это было бы не случайно? и, да, это возможно. вы должны изменить свой вопрос, чтобы спросить, как это будет сделано и сузить до определенной области, а не просто спрашивать, возможно ли это. –

+2

Вы ищете функцию хеширования? (И если это так, вы хотите, чтобы он использовался в Javascript или PHP? Ваш вопрос отмечен обоими ...) Но, возможно, что более важно, почему вы хотите это сделать? Важно выбрать правильную функцию хеширования для вашего использования. –

+0

Мне нужно сделать это на PHP, извините за тегирование обоих, мое плохое. Я просто хочу назначить «случайный» цвет для каждого расширения файла. Например, «.jpg» всегда следует назначать один и тот же случайный цвет. Я не знаю, имею ли я смысл или нет. – Tom

ответ

2

Что вам нужно, это не случайный, но a хеширование функция.

Алгоритм хэширования создает отпечаток входных данных. Хэш обычно не обратим, т. Е. Вы не можете восстановить данные из хэша. (Тем не менее, если алгоритм имеет недостатки, вы можете создать столкновения, но до тех пор, пока вы не делаете ничего связанные с безопасностью, в этом нет ничего страшного.)

К сожалению, нет родных хэширования Алгоритмы, реализованные в JS, поэтому вы должны реализовать свои собственные. Однако вот сообщение SO, которое показывает реализацию: https://stackoverflow.com/a/7616484/3908235

И, судя по всему, есть whole library with the implementation of common algorithms (спасибо @MattGibson).

+1

[CryptoJS имеет набор хэшей] (https://code.google.com/p/crypto-js/) –

0

Если вы хотите сделать это на PHP, то вы можете использовать . Это не случайный, но он производит номера, которые будут меняться в зависимости от содержимого строки. На 100% гарантировано, что две разные строки будут выдавать разные цифры.

Пример:

$number = crc32("http://php.net/manual/en/function.crc32.php"); 

Обратите внимание, что $number будет беззнаковое 32-битный целое число, но РНР интерпретирует все целые числа как целые, значение может быть представлено по-разному между 32-битных средах - которые могут возвращать отрицательные и положительные числа - и 64-битные среды, которые возвратят только положительные числа.

Это хорошая идея для форматирования вывода с помощью printf вывести это на ваш HTML,

printf("%u", $number); 

Для сравнения значений, полученных в различных архитектурах, вы должны также форматировать строку, используя sprintf, просто чтобы быть безопасный:

$numberToStoreShareOrCompare = sprintf("%u", $number);