Никогда не генерировать случайное число снова - PullRequest
0 голосов
/ 21 сентября 2011

Я ищу решение PHP для генерации случайных чисел, которое не генерировало то же число снова ... есть ли какое-то решение, пожалуйста, дайте мне знать ..

Мне нужно это решение для одного из моих проектов, которые генерируютUniQ ключ для URL, и я не хочу проверять Сгенерированный номер существует или нет из данных ..

Спасибо ..

--------- РЕДАКТИРОВАТЬ ---------

Я использую этот метод генерации случайных чисел, его справка заполнена?

function randomString($length = 10, $chars = '1234567890') {

// Alpha lowercase
if ($chars == 'alphalower') {
    $chars = 'abcdefghijklmnopqrstuvwxyz';
}

// Numeric
if ($chars == 'numeric') {
    $chars = '1234567890';
}

// Alpha Numeric
if ($chars == 'alphanumeric') {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
}

// Hex
if ($chars == 'hex') {
    $chars = 'ABCDEF1234567890';
}

$charLength = strlen($chars)-1;

for($i = 0 ; $i < $length ; $i++)
    {
        $randomString .= $chars[mt_rand(0,$charLength)];
    }

return $randomString;
}

Ответы [ 6 ]

4 голосов
/ 21 сентября 2011

Посмотрите на функцию php uniqid(): http://php.net/manual/en/function.uniqid.php

2 голосов
/ 21 сентября 2011

Невозможно сгенерировать случайное число, которое является уникальным - если генератор зависит от состояния, то выход по определению не случайный.

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

Вам действительно нужно случайное число или вам нужен порядковый номер или уникальный идентификатор - это 3 отдельные вещи.

, который генерирует уникальный ключ для URL

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

И MySQL, и PHP имеют встроенную функциональность для генерации uuids , хотя, поскольку большинство СУБД поддерживают генерацию суррогатных ключей, у этого подхода мало очевидных преимуществ.

1 голос
/ 21 сентября 2011

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

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

Типичный ответ - использовать GUID или UUID, хотя я избегаю тех форм, которые используют только случайные числа.(Например, избегайте GUID версии 4 или UUID)

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

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

Игнорируйте uniqids и тому подобное, потому что они просто неверны.

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

Не существует реальных генераторов случайных чисел с "идеальной и низкой ценой" !!

Лучшее, что можно сделать из математических функций, - это псевдослучайность, которая в конце концов кажется достаточно случайной для большинства намерений и целей.

mt_rand функция использует твистер Мерсенна, который является довольно хорошим PRNG!

так что это, вероятно, будет достаточно для обычного использования.

для получения дополнительной информации, смотрите здесь: http://php.net/manual/en/function.mt-rand.php

возможная реализация кода

<?php
   $random = mt_rand($yourMin, $yourMax);
?>

EDITD:

найти очень хорошее объяснение здесь:

Создание криптографически безопасных случайных чисел в php

...