Я хочу создать уникальное значение длиной 12 символов. Для генерации уникальных значений я использую этот метод:
function generate_unique_id()
{
$time = substr(time(), -7);
$month = mb_strtolower(date("M"));
$symbol = "OM";
$string = $month."".$time."".$symbol;
$result = str_shuffle($string);
return $result;
}
Я протестировал этот код, чтобы сгенерировать 30 000 уникальных значений, но каждый раз при выходе из цикла без создания необходимых уникальных идентификаторов.
$array = [];
for($i=0; $i<=3; $i++)
{
$unique_id = generate_unique_id();
if(in_array($unique_id, $array)){
echo $i;
break;
}
$array[] = $unique_id;
}
Как узнать количество сгенерированных уникальных значений длиной 12 символьных строк и быстро сгенерировать уникальное значение, если возможность генерации не достигла предела максимального числа.
Код ниже сгенерирован 30000 уникальные идентификаторы в +21,3783249855041 секунд.
$ids = [];
while (count($ids) < 30000) {
$id = bin2hex(random_bytes(6));
if (!in_array($id, $ids)) array_push($ids, $id);
}
var_dump(count($ids));
var_dump($ids);
Приведенный выше код будет продолжать генерировать идентификаторы, пока он не получит 30000 уникальных идентификаторов, нет никаких причин для break
,
1Время генерации может варьироваться.
Живой пример
Обновление № 1
Для тех, у кого нет PHP 7, вы можете использовать этот функция.
Обновление № 2
Этот фрагмент является значительно более эффективным, в соответствии с @cckep комментарий:
$time_start = microtime(true);
$ids = [];
while (count($ids) < 30000) {
$id = bin2hex(random_bytes(6));
if (!isset($ids[$id])) $ids[$id] = true;
}
$ids = array_keys($ids);
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
var_dump(count($ids));
var_dump($ids);
echo $execution_time;
Непроверенный, должен работать хотя (случайный префикс + суффикс шестнадцатеричного счетчика):
<?php
function unique_id($length = 12)
{
static $counter = 0;
$suffix = dechex($counter);
$prefixLen = $length - strlen($suffix);
$prefix = substr(uniqid(), -$prefixLen);
$counter++;
return $prefix.$suffix;
}
$arr = array();
for ($i = 0; $i < 30000; $i++)
{
$id = unique_id();
if (in_array($id, $arr))
{
echo $id."\n";
break;
}
$arr[]= $id;
}
echo "Generated ".count($arr)." unique IDs.\n";
Обратите внимание, что это работает, только если вам нужны все эти идентификаторы в один выполнение запроса / скрипта. Новый запрос вызовет статический $counter
переменная, чтобы начать заново, что больше не гарантирует уникальные идентификаторы.