Случайное число / буквенное значение - PullRequest
1 голос
/ 12 августа 2011

Так что мне было интересно, какие есть хорошие / предпочтительные методы для генерации «шестнадцатеричного» значения в PHP?Предпочтительно, я бы хотел ограничить его длиной до 5 символов, например: 1e1f7

В настоящее время это то, что я делаю:

echo dechex(mt_rand(10000, 99999));

однако это дает мне значения от 4 до5 символов в длину, и я хочу, чтобы он оставался равным 4 или 5.

Какими способами лучше сгенерировать что-то подобное в PHP?Есть ли даже встроенная функция?

Примечание : Когда я говорю «шестнадцатеричный», я действительно имею в виду случайную комбинацию букв и цифр.Не должно быть ограничений на количество доступных писем.

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Что-то простое, например:

$length = 5;
$string = "";
while ($length > 0) {
    $string .= dechex(mt_rand(0,15));
    $length -= 1;
}
return $string;

(не проверено)

Или исправьте свой диапазон mt_rand на: mt_rand(65535, 1048575) (10000-fffff в шестнадцатеричном формате) или если вам нравятся шляпы из фольги: mt_rand(hexdec("10000"), hexdec("ffffff"))

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

Если вы действительно хотите случайные вещи, я бы предложил:

$length = 5;
$string = "";
$characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=+!@#$%^&*()[]"; // change to whatever characters you want
while ($length > 0) {
    $string .= $characters[mt_rand(0,strlen($characters)-1)];
    $length -= 1;
}
return $string;

(не проверено)

1 голос
/ 18 августа 2012

Почему весь рабочий sha1 тестируется и распределяется равномерно:

substr(sha1(uniqid('moreentropyhere')),0,5);

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

вы можете даже использовать двоичную форму хэша sha1 для базы 64:

base64_encode(sha1(uniqid('moreentropyhere'), true))

, чтобы ограничить символы, вы можете использовать регулярное выражение:

substr(preg_replace('~[^a-km-np-z2-9]~','',strtolower(base64_encode(sha1(uniqid(),true)))),0,6)

Здесь мы ограничиваем 0,1, l (букву) и o (букву) из строки, торгуя небольшой энтропией, чтобы избежать путаницы (и билетов на обслуживание) во время входа для всех возрастов ...

1 голос
/ 12 августа 2011
echo substr( base64_encode( mt_rand(1000, mt_getrandmax() ), 0, 5);

При этом используется больше алфавита из-за base64, но помните, что он будет включать в себя прописные и строчные буквы вместе с цифрами.

...