Уникальность в ID - PullRequest
       10

Уникальность в ID

1 голос
/ 28 декабря 2010

Я использую код первой половины ниже, чтобы сгенерировать уникальный идентификатор. Затем я использую запись, сгенерированную в первой половине, в качестве переменной для второго фрагмента кода, который генерирует другой уникальный идентификатор, который короче, будет ли код, который я использую, гарантировать 100% уникальность. Я новичок, поэтому, пожалуйста, потерпите меня:

PHP:

// 1st Piece of code

// 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();

//2nd Piece of code

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

ob_start();
echo base_encode($Guid, $alphabet); //should output: bUKpk
$ider = ob_get_contents();
ob_end_clean();

Ответы [ 2 ]

4 голосов
/ 28 декабря 2010

Будет ли код, который я использую, гарантировать 100% уникальность?

Конечно, невозможно гарантировать 100% уникальность при случайном GUID. очень вероятно , что каждый GUID будет уникальным, но существует только конечное (но очень большое) количество GUID. Если вы сгенерируете их достаточно, у вас останутся неиспользованные идентификаторы GUID, и вы будете вынуждены создать дубликат. А парадокс дня рождения 1008 * означает, что случайный выбор GUID в среднем даст вам дубликат раньше, чем вы думаете.

Но на практике, вероятно, не стоит беспокоиться, поскольку даже с парадоксом дня рождения это все равно крайне маловероятно.

1 голос
/ 28 декабря 2010

Посмотрите на этот класс: http://www.shapeshifter.se/2008/09/29/uuid-generator-for-php/

...