2

uuidこのutf8文字列を生成するcassandraから使用しています:

f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21

しかし、私が見つけたいくつかのグーグルの後、私はそれを4〜6文字の間のどこかに短くする必要があります

base_convert($id, 5, 36);

どれがまさにそれを行いますが、本当にユニークであり続けるのでしょうか?

これはおそらくばかげた質問ですが、説明が必要です。

4

3 に答える 3

3

これはutf8文字列ではありません。UTF8は文字エンコードであり、UUIDは7ビットエンコーディングにも完全に適合します。base_convert()UUIDが数値ではないため(少なくとも-)は機能しません。いいえ、4文字に短縮しても改善されません。0〜9を使用し、azが36!4の組み合わせのみを提供すると仮定すると、衝突が発生する可能性が非常に高くなります(そして、そのIDを生成する方法と頻度を誰が知っているか)。一般に、一意にする必要がある場合は、一意にします(たとえば、既に生成されたIDをDBに保存して、衝突が発生したときにわかるようにします)。今、あなたはただ期待していて、指を交差させようとしています。

于 2012-11-24T16:03:22.413 に答える
2

カサンドラウィキから:

[...] UUIDs are represented by a 32 digit hexadecimal number in the form of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

あなたの例のUUIDでわかるように、、、、などのばかげた文字がいくつrvありhますq。これは間違いが原因であると想定し、あなたの質問に答えようとします:

を使用する場合はbase_convert、まずハイフンを省略してください。

関数のbase_convert()シグネチャは次のとおりです。

string base_convert ( string $number , int $frombase , int $tobase )

この場合の引数は 5 ではなく 16 にする必要があることに注意してfrombaseください。これは、UUID が 32 桁の 16 進数であるためです。

そして最後に、そのまま使用できる最大数ですtobase36マニュアルによる)。

したがって、あなたができる最善のことは次のとおりです。

base_convert($yourNumber, 16, 36);

変換後の数値の長さは 4 ~ 6 文字を超えます。したがって、を使用して UUID を縮小し、一意の番号を保持することはできませんbase_convert()

技術的には、UUID を 16 進数として想定し、それを基数 128 に変換すると、4 文字の長さの結果が得られます。

于 2012-11-24T16:19:38.223 に答える
1

PHP に組み込まれている uniqid() 関数を調べましたか? デフォルトでは 14 文字の文字列が返され、カスタム プレフィックスを入力して一意性を追加できると思います。

uniqid() の詳細については、http://php.net/manual/en/function.uniqid.php を参照してください

于 2012-11-24T16:18:06.870 に答える