Как я могу сгенерировать несуществующий идентификатор в массиве?

Я хочу создать уникальное значение длиной 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 символьных строк и быстро сгенерировать уникальное значение, если возможность генерации не достигла предела максимального числа.

1

Решение

Код ниже сгенерирован 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Время генерации может варьироваться.

Живой пример

Repl

Обновление № 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;
1

Другие решения

Непроверенный, должен работать хотя (случайный префикс + суффикс шестнадцатеричного счетчика):

<?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 переменная, чтобы начать заново, что больше не гарантирует уникальные идентификаторы.

1

По вопросам рекламы [email protected]