2010-12-28 12 views
1

以下の前半のコードを使用して一意のIDを生成しています。次に、もう少しユニークなIDを生成するコードの2番目の部分の変数として、前半に生成されたエントリを使用しています。コードは100%一意性を保証します。IDの一意性

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(); 
+0

'uniqid()'の問題点は何ですか? – Maerlyn

答えて

4

は私が保証100%の一意性を使用していたコードの意志を私は私と一緒に裸してください新しいのですか?

もちろん、ランダムGUIDで一意性を100%保証することはできません。 の可能性があります各GUIDは一意ですが、有限(ただし非常に大きい)のGUID数しかありません。それらを十分に生成すると、最終的には未使用のGUIDがなくなり、強制的に複製を生成することになります。 birthday paradoxは、ランダムにGUIDを選択すると、思ったよりも早く重複することになります。

しかし、実際には誕生日のパラドックスであっても心配する価値はないでしょうが、それはまだ起こりそうにありません。

+0

私は、データベース内のユーザーとそれらが生成するコンテンツに関連付ける方法としてこれを使用しています。 – AAA

+0

あなたはどのデータベースエンジンを使用していますか? MySQLとPostgreSQLはどちらも自動インクリメントプライマリキーをサポートしています。私はそれを調べるだろう。 – sberry

+0

@マークどのように生成するものが一意であるかどうかを確認するためにデータベースをチェックするコード行を書くことができ、それが再び実行され、一意のIDが生成されるまで。 – AAA