uuid
このutf8文字列を生成するcassandraから使用しています:
f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21
しかし、私が見つけたいくつかのグーグルの後、私はそれを4〜6文字の間のどこかに短くする必要があります
base_convert($id, 5, 36);
どれがまさにそれを行いますが、本当にユニークであり続けるのでしょうか?
これはおそらくばかげた質問ですが、説明が必要です。
これはutf8文字列ではありません。UTF8は文字エンコードであり、UUIDは7ビットエンコーディングにも完全に適合します。base_convert()
UUIDが数値ではないため(少なくとも-
)は機能しません。いいえ、4文字に短縮しても改善されません。0〜9を使用し、azが36!4の組み合わせのみを提供すると仮定すると、衝突が発生する可能性が非常に高くなります(そして、そのIDを生成する方法と頻度を誰が知っているか)。一般に、一意にする必要がある場合は、一意にします(たとえば、既に生成されたIDをDBに保存して、衝突が発生したときにわかるようにします)。今、あなたはただ期待していて、指を交差させようとしています。
カサンドラウィキから:
[...] UUIDs are represented by a 32 digit hexadecimal number in the form of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
あなたの例のUUIDでわかるように、、、、などのばかげた文字がいくつr
かv
ありh
ますq
。これは間違いが原因であると想定し、あなたの質問に答えようとします:
を使用する場合はbase_convert
、まずハイフンを省略してください。
関数のbase_convert()
シグネチャは次のとおりです。
string base_convert ( string $number , int $frombase , int $tobase )
この場合の引数は 5 ではなく 16 にする必要があることに注意してfrombase
ください。これは、UUID が 32 桁の 16 進数であるためです。
そして最後に、そのまま使用できる最大数ですtobase
(36
マニュアルによる)。
したがって、あなたができる最善のことは次のとおりです。
base_convert($yourNumber, 16, 36);
変換後の数値の長さは 4 ~ 6 文字を超えます。したがって、を使用して UUID を縮小し、一意の番号を保持することはできませんbase_convert()
。
技術的には、UUID を 16 進数として想定し、それを基数 128 に変換すると、4 文字の長さの結果が得られます。
PHP に組み込まれている uniqid() 関数を調べましたか? デフォルトでは 14 文字の文字列が返され、カスタム プレフィックスを入力して一意性を追加できると思います。
uniqid() の詳細については、http://php.net/manual/en/function.uniqid.php を参照してください。