web-dev-qa-db-ja.com

java.util.UUID.randomUUID()。toString()の長さ

Java.util.UUID.randomUUID()。toString()の長さは常に36ですか?

私はそれに関する情報を見つけることができませんでした。 ここ 以下のみと言われています:

public static UUID randomUUID()タイプ4(疑似ランダムに生成された)UUIDを取得する静的ファクトリー。 UUIDは、暗号的に強力な疑似乱数ジェネレーターを使用して生成されます。戻り値:ランダムに生成されたUUID

そして、type 4は何も教えてくれません。この場合、タイプ4の意味がわかりません。

30
Yaroslav

Java.util.UUID.randomUUID()。toString()の長さは常に36ですか?

はい!!です。

UUIDは、実際には128ビット値(2つの長さ)です。 16進文字列に128ビットを表すには、128/4=32 char(各charは4ビット長)があります。文字列形式では、4(-)も含まれているため、長さは36です。

例:54947df8-0e9e-4471-a2f9-9af509fb5889

32 hex char + 4 hyphen char = 36 char。したがって、長さは常に同じになります。


更新:

この場合、タイプ4の意味がわかりません。

参考:UUIDを生成する方法はいくつかあります。タイプ4は、このuuidが乱数または擬似乱数を使用して生成されることを意味します。ウィキから- niversally_unique_identifier#Versions

バージョン

バリアント1と2の両方について、5つの「バージョン」が標準で定義されており、特定のユースケースでは、各バージョンが他のバージョンよりも適切な場合があります。バージョンは、文字列表現のMで示されます。

バージョン1時間とノードID(通常はMACアドレス)からUUIDが生成されます。

バージョン2UUIDは、識別子(通常はグループまたはユーザーID)、時間、およびノー​​ドIDから生成されます。

バージョン3および5は、名前空間の識別子と名前をハッシュすることによって生成される決定論的なUUIDを生成します。

およびバージョン4UUIDは、乱数または擬似乱数を使用して生成されます。

46
ruhul

Base64を使用してUUIDv4 16バイトバイナリを24バイトASCIIに変換し、代わりにascii-hex(32バイト)にエンコードできます。

3
Daniel Almeida

Javadocを読む前にグーグル検索を開始する私のような人、ここではjavadoc;)

ID.toString

下から上に読む文法ツリーの読み方がわからない人のために。
anhexDigitは1文字です
anhexOctetは2 hexDigits = 2charsです
anodeは6 * hexOctet = 6 * 2hexdigit = 6 * 2 chars = 12chars
avariant_ and_sequenceは2 * hexOctet = 2 * 2hexdigit = 2 * 2 chars = 4chars
atime_high_and_versionは2 * hexOctet = 2 * 2hexdigit = 2 * 2 chars = 4chars
atime_midは2 * hexOctet = 2 * 2hexdigit = 2 * 2 chars = 4chars
atime_lowは4 * hexOctet = 4 * 2hexdigit = 4 * 2 chars = 8chars
そして最後に、aUUIDは<time_low> "-" <time_mid> "-" <time_high_and_version> "-" < variant_and_sequence> "-" <node>

= 8文字+ 1文字+ 4文字+ 1文字+ 4文字+ 1文字+ 4文字+ 1文字+ 12文字

= 36文字!前述のとおり、128ビットのデータ+ 4つのハイフン

The UUID string representation is as described by this BNF: 

 UUID                   = <time_low> "-" <time_mid> "-"
                          <time_high_and_version> "-"
                          <variant_and_sequence> "-"
                          <node>
 time_low               = 4*<hexOctet>
 time_mid               = 2*<hexOctet>
 time_high_and_version  = 2*<hexOctet>
 variant_and_sequence   = 2*<hexOctet>
 node                   = 6*<hexOctet>
 hexOctet               = <hexDigit><hexDigit>
 hexDigit               =
       "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
       | "a" | "b" | "c" | "d" | "e" | "f"
       | "A" | "B" | "C" | "D" | "E" | "F"
1
user43968