ID的唯一性

时间:2010-12-28 18:30:54

标签: php mysql database unique

我使用下面的上半部分代码生成唯一ID。然后我使用上半部分生成的条目作为第二段代码的变量,生成另一个更短的唯一ID,我正在使用的代码将保证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 个答案:

答案 0 :(得分:4)

  

我使用的代码是否保证100%唯一性?

当然,使用随机GUID 100%保证唯一性是不可能的。 很可能每个GUID都是唯一的,但只有一个有限(但非常大)的GUID。如果生成足够多的GUID,则最终会耗尽未使用的GUID并被强制生成重复项。而birthday paradox意味着随机选择GUID平均会比您想象的更快地复制。

但是在实践中可能不值得担心,即使是生日悖论,它仍然极不可能发生。

答案 1 :(得分:1)