Уникальный альфа-цифровой генератор - PullRequest
1 голос
/ 23 декабря 2010

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

старый php:

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(md5(uniqid(rand(),true))); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;
echo "<br><br><br>";

Новый PHP:

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(uniqid("something",true)); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;
echo "<br><br><br>";

Будет ли второй (новый php) код гарантировать 100%уникальность.

Итоговый код:

PHP

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(uniqid(rand(),true)); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';    

function base_encode($num, $alphabet) {
    $base_count = strlen($alphabet);
    $encoded = '';

    while ($num >= $base_count) {

        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
        return $encoded;
}


function base_decode($num, $alphabet) {
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

echo base_encode($Guid, $alphabet); 

}

Поэтому для большей уникальности я использую $ Guid в качестве генератора ключей.Это должно быть хорошо, верно?

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

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

Ваш метод не гарантирует уникальность вообще.И, вероятно, будет создавать столкновения.

2 голосов
/ 31 декабря 2010

уникальный: <?php $substr = substr(md5(rand()),0,22);echo " $substr ";?>

2 голосов
/ 23 декабря 2010

Приведенный ниже код сгенерирует вам уникальный буквенно-цифровой идентификатор из числа.Я взял это из Flickr групп .Две функции кодирования и декодирования:

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';    

function base_encode($num, $alphabet) {
    $base_count = strlen($alphabet);
    $encoded = '';

    while ($num >= $base_count) {

        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
        return $encoded;
}

function base_decode($num, $alphabet) {
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

ОБНОВЛЕНИЕ

Использование:

echo base_encode(123456789, $alphabet); //should output: bUKpk
1 голос
/ 23 декабря 2010

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

Действительно ли это должно быть случайным?

Почему бы просто не использовать столбец автоинкремента в таблице, а затем преобразовать его в base-62 (или около того), если вы хотите сослаться на него как буквенно-цифровое значение?

...