Как я могу сгенерировать несуществующий идентификатор в массиве? - PullRequest
0 голосов
/ 27 июня 2018

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Сгенерированный ниже код 30000 уникальных идентификаторов в 21.378324985504 1 секунд.

$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);

Приведенный выше код будет продолжать генерировать идентификаторы, пока он не получит 30 000 уникальных идентификаторов, для 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;
0 голосов
/ 27 июня 2018

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

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

...