データベースIDをシーケンシャルにしたくないので、次のコードを使用してuidを生成しようとしています。
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
私の質問は、大量のレコード(Twitterなど)を処理するのに十分なIDを一意にするために何バイト必要ですか?
データベースIDをシーケンシャルにしたくないので、次のコードを使用してuidを生成しようとしています。
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
私の質問は、大量のレコード(Twitterなど)を処理するのに十分なIDを一意にするために何バイト必要ですか?
uniqid()
エントロピー係数を追加したPHPを使用します。それはあなたに十分な余地を与えるでしょう。
tinyurlやその他の短縮サービスの仕組みのようなものを検討するかもしれません。私は同様の手法を使用しました。これにより、すべての組み合わせが使い果たされるまで一意性が保証されます。つまり、基本的にはアルファベットを選択し、長さとして必要な文字数を選択します。たとえば、上と下の英数字を使用すると、アルファベットは62文字になり、コードごとに5文字になります。これは62^5=916,132,832の組み合わせです。
シーケンシャルデータベースIDから始めて、それを素数で乗算します(2097593のようにかなり大きいものを選択してください)。これにデータベースIDを掛けて、62 ^ 5を超える場合は必ず折り返し、選択したアルファベットに従ってその数値をbase-62に変換するだけです。
これにより、各コードはかなり一意に見えますが、素数を使用しているため、すべてのコードを使用するまで、同じ番号を2回ヒットしないことが保証されています。そして、それは非常に短いです。
長さが問題にならない場合は、短いアルファベットで長いキーを使用することもできます。
同じ行に沿って私が尋ねた質問は次のとおりです。Tinyurlスタイルの一意のコード:衝突を防ぐための潜在的なアルゴリズム
MySQLUUIDを使用する
insert into `database`(`unique`,`data`) values(UUID(),'Test');
MySQLを使用していない場合はGoogleでUUID(データベース名)を検索し、オプションが表示されます
ソースウィキペディア
つまり、次の100年間で毎秒10億のUUIDを生成した後でのみ、複製を1つだけ作成する確率は約50%になります。
それがすべての可能な値を生成する可能性があると仮定するとopenssl_random_pseudo_bytes
、Nバイトは2 ^ (N * 8)
明確な値を提供します。12バイトの場合、これは7.923 * 10^28