Как создать уникальный 20-байтовый токен / ключ / ID на php? - PullRequest
1 голос
/ 04 марта 2010

Мне нужно создать токен / ключ, чтобы использовать его в качестве порядкового номера, поэтому он должен быть уникальным, токены должны быть чем-то вроде «6X990742MG185953R», чтобы мы могли использовать его как штрих-код, т.е. http://barcodes4.me/barcode/c128b/6X990742MG185953R.png

Мы не можем использовать UUID или GUID, потому что чем длиннее, тем ближе мы к этому:

</p> <pre><code>function uuid64() { $uuid = uuid(); // some UUID v4 $byteString = ""; $uuid = str_replace("-", "", $uuid); for($i = 0; $i < strlen($uuid); $i += 2) { $s = substr($uuid, $i, 2); $d = hexdec($s); $c = chr($d); $byteString = $byteString.$c; } $b64uuid = base64_encode($byteString); // Replace the "/" and "+" since they are reserved characters $b64uuid = str_replace("/", "_", $b64uuid); $b64uuid = str_replace("+", "-", $b64uuid); // Remove the trailing "==" $b64uuid = substr($b64uuid, 0, strlen($b64uuid) - 2); return $b64uuid; }

Ответы [ 4 ]

5 голосов
/ 04 марта 2010

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

$length = 20;
$characters = ‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
$random_string = "";    
for ($p = 0; $p < $length; $p++) {
    $random_string .= $characters[mt_rand(0, strlen($characters))];
}

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

3 голосов
/ 04 марта 2010

я думаю, что вы ответили на вопрос в своем последнем комментарии, да, генерируйте UID непосредственно из идентификаторов автоинкремента вашей базы данных + символы заполнения, например,

function uid($n) {
    $id_part = base_convert($n, 10, 36);
    $rand_part = str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789');
    return sprintf("%05s%.15s", $id_part, $rand_part);
}

это создает UID с 5-ю основными символами base-36 + 15 символами для мусора

0 голосов
/ 04 марта 2010

Если вам нужен короткий уникальный идентификатор, вам определенно нужна база данных, чтобы сохранить все предыдущие идентификаторы.

while (true)
{
    $prefix = "";
    $mid = $prefix . rand(100000,999999) . chr(rand(65, 90));
    $check = mysql_query("SELECT id FROM ids WHERE id = '$mid'");
    if (mysql_num_rows($check) != 0)
    {
        //duplicate
    }
    else
    {
        mysql_query("insert into ids VALUES('$mid')");
        break 1;
    }
}
0 голосов
/ 04 марта 2010

Я нашел эту функцию, возвращает токен, похожий на стиль tinyurl

</p> <pre><code>function gen_uuid($len = 8) { $hex = md5("some_salt_please" . uniqid("", true)); $pack = pack('H*', $hex); $uid = base64_encode($pack); $uid = ereg_replace("[^A-Z0-9]", "", strtoupper($uid)); if ($len<4) $len=4; if ($len>128) $len=128; while (strlen($uid)<$len) $uid = $uid . gen_uuid(22); return substr($uid, 0, $len); }

...