9

私がやろうとしているのは、YouTubeがビデオIDを処理する方法(http://www.youtube.com/watch?v=53iddd5IcSU)と同様に、私のWebサイトの記事に12文字のIDを作成することです。現在、MD5ハッシュを生成してから、次のように12文字を取得しています。

$ArticleId = substr(MD5("Article".$currentID),10,12)

ここで、$ currentIDはデータベースからの数値IDです(例:144)

重複した$ArticleIdに遭遇するのは少し妄想的ですが、現実的には、これが発生する可能性はどのくらいありますか?また、私のデータベースの列は一意であるため、醜いエラーをスローせずにこのまれなシナリオを処理するにはどうすればよいですか?

PS最初の5​​000$ArticleId内の重複をチェックするための小さなスクリプトを作成しましたが、何もありませんでした。

編集:base64_encodeハッシュの外観が気に入らないので、これを行いました:

function retryAID($currentID)
{
    $AID = substr(MD5("Article".$currentID*2),10,12);

    $setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
    mysql_query($setLID) or retryAID($currentID);
}


$AID = substr(MD5("Article".$currentID),10,12);

$setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
mysql_query($setAID) or retryAID($currentID);

AID列は一意であるため、mysql_queryはエラーをスローし、retryAID関数は一意のIDを検出します...

4

4 に答える 4

6

シーケンシャルIDを使用することの何が問題になっていますか?データベースがこれを処理します。

それはさておき、12文字はまだ96ビットです。2 96 =79228162514264337593543950336可能なハッシュ。MD5には衝突の脆弱性があることが知られていますが、衝突の可能性と実際に衝突が発生する確率には違いがあります。

アップデート:

使用しているPHPmd5関数の戻り値に基づくと、上記の数値は正しくありません。

ハッシュを32文字の16進数として返します。

32文字の16進数から12文字を取得しているため(128ビットハッシュの12バイトではない)、最終的に可能なハッシュの実際の数は16 12 =281474976710656です。それでもかなりの数です。

于 2010-02-14T04:11:23.130 に答える
1
<?php
  function get_id()
  {
    $max = 1679615; // pow(36, 4) - 1;
    $id = '';

    for ($i = 0; $i < 3; ++$i)
    {
      $r = mt_rand(0, $max);
      $id .= str_pad(base_convert($r, 10, 36), 4, "0", STR_PAD_LEFT);
    }
    return $id;
  }
?>

三十六進法で12文字の数値を返します。これにより、4,738,381,338,321,616,896の可能性が得られます。(衝突の確率は、乱数ジェネレーターの分布によって異なります。)

衝突が発生しないようにするには、ループする必要があります。

<?php
do {
  $id = get_id();
} while ( !update_id($id) );
?>
于 2010-02-14T05:41:39.087 に答える
0

それほどユニークではありません。

短くする必要がある場合は、base64でエンコードしてみませんか?

于 2010-02-14T04:09:23.743 に答える
0

UUIDはどうですか?

http://php.net/manual/en/function.uniqid.php

于 2010-02-14T05:16:41.180 に答える