0

データベースIDをシーケンシャルにしたくないので、次のコードを使用してuidを生成しようとしています。

$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);

私の質問は、大量のレコード(Twitterなど)を処理するのに十分なIDを一意にするために何バイト必要ですか?

4

4 に答える 4

3

uniqid()エントロピー係数を追加したPHPを使用します。それはあなたに十分な余地を与えるでしょう。

于 2012-09-18T15:05:02.987 に答える
2

tinyurlやその他の短縮サービスの仕組みのようなものを検討するかもしれません。私は同様の手法を使用しました。これにより、すべての組み合わせが使い果たされるまで一意性が保証されます。つまり、基本的にはアルファベットを選択し、長さとして必要な文字数を選択します。たとえば、上と下の英数字を使用すると、アルファベットは62文字になり、コードごとに5文字になります。これは62^5=916,132,832の組み合わせです。

シーケンシャルデータベースIDから始めて、それを素数で乗算します(2097593のようにかなり大きいものを選択してください)。これにデータベースIDを掛けて、62 ^ 5を超える場合は必ず折り返し、選択したアルファベットに従ってその数値をbase-62に変換するだけです。

これにより、各コードはかなり一意に見えますが、素数を使用しているため、すべてのコードを使用するまで、同じ番号を2回ヒットしないことが保証されています。そして、それは非常に短いです。

長さが問題にならない場合は、短いアルファベットで長いキーを使用することもできます。

同じ行に沿って私が尋ねた質問は次のとおりです。Tinyurlスタイルの一意のコード:衝突を防ぐための潜在的なアルゴリズム

于 2012-09-18T15:15:12.267 に答える
0

MySQLUUIDを使用する

insert into `database`(`unique`,`data`) values(UUID(),'Test');

MySQLを使用していない場合はGoogleでUUID(データベース名)を検索し、オプションが表示されます

ソースウィキペディア

つまり、次の100年間で毎秒10億のUUIDを生成した後でのみ、複製を1つだけ作成する確率は約50%になります。

于 2012-09-18T15:16:42.890 に答える
0

それがすべての可能な値を生成する可能性があると仮定するとopenssl_random_pseudo_bytes、Nバイトは2 ^ (N * 8)明確な値を提供します。12バイトの場合、これは7.923 * 10^28

于 2012-09-18T15:24:38.587 に答える