Как сгенерировать случайное, но уникальное число и отобразить его в источнике моего тега изображения - PullRequest
2 голосов
/ 10 июня 2010

Я немного искал, но действительно не нашел то, что искал. Я хотел бы создать случайный НО уникальный 5-значный номер и вставить любой номер в тег img на моей странице.

Например, когда люди приходят на мою страницу, это число генерируется и помещается в тег изображения:

<img src="http://www.sample.com?randomNUM=12345" height="1" width="1" />

У меня есть база данных MySQL, и я собираюсь сделать это на PHP.

Спасибо

Мэтт

Ответы [ 11 ]

4 голосов
/ 10 июня 2010

Вы можете использовать uniqid:

Получает префиксный уникальный идентификатор на основе текущего времени в микросекунд.

3 голосов
/ 10 июня 2010

Если вы хотите обойти кэширование, как говорит Red Filter, лучше использовать текущую временную метку.

Если вы действительно хотите получить уникальное 5-значное число, вам придется отслеживатьиз каких номеров вы использовали в прошлом.Вы можете использовать простую базу данных для этого.Вы создаете случайное число, используя rand() или, согласно руководству, лучше, mt_rand(), а затем запрашиваете, использовалось ли оно уже:

 SELECT FROM mytable WHERE random_number = '$random_number'

повторять до тех пор, показапрос возвращает ноль записей.

Затем используйте номер и вставьте его в запись базы данных:

 INSRT INTO mytable (random_number) VALUES ('$random_number');

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

3 голосов
/ 10 июня 2010

Какова ваша цель сделать это? Если вы хотите обойти кеширование, вы можете добавить текущую дату / время.

1 голос
/ 10 июня 2010

Я не специалист по теории чисел, но я не уверен, что вы можете иметь случайное число и гарантировать его уникальность. См:

https://mywebspace.wisc.edu/lnmaurer/web/rng_stuff/Dilbert0001.jpg

Как подсказывает Red Filter, использование текущей метки времени является хорошим подходом для предотвращения кэширования. Каждый момент времени уникален.

1 голос
/ 10 июня 2010

Вы можете взглянуть на руководство PHP rand ().

0 голосов
/ 11 июня 2010

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

0 голосов
/ 11 июня 2010

Если вы в конечном итоге не ограничиваете себя 5 цифрами, и все в порядке с использованием строк в качестве ключа, забавным хаком будет получить время в микросекундах [[http://php.net/manual/en/function.microtime.php]], а затем добавить псевдо- случайное число, которое представляет собой совокупность ряда факторов, основанных на пользователе, который делает запрос (например, IP-адрес, sessionID и т. д.), и другое случайное число.Тогда MD5 все это так, чтобы вы получили свой результат в общем формате.

Если вы можете предположить, что ваши пользователи будут делать только один запрос в микросекунду, это должно сработать:

<?php

$Rand = md5($_SERVER['HTTP_CLIENT_IP'].microtime(true).rand(1,999))

?>
0 голосов
/ 10 июня 2010

Вы смотрели на функцию uuid () в MySQL 5.0?

0 голосов
/ 10 июня 2010

Создайте массив из 100 000 доступных 5-значных чисел, соответственно перемешайте , используйте по порядку.

0 голосов
/ 10 июня 2010

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

Отметка времени содержит компромисс между возможными одновременными запросами, которые генерируют одно и то же число (вы можете уменьшить вероятность этого события, используя get_microtime)

Проверьте также функцию uniqid для большей «уникальности».

...