web-dev-qa-db-ja.com

ランダムに生成されたUUIDの「-」を削除するのは安全ですか?

私はこのコードを持っています:

String uuid = UUID.randomUUID().toString().replace("-", "");

生成されたUUIDの「-」を削除するのは安全ですか?これを削除すると、グローバルに一意であるという目的が失われ、生成されたUUIDが衝突しやすくなりますか?

62
xybrek

生成されたUUIDの「-」を削除することがどれだけ安全か

ダッシュは値の一部ではないため、100%安全です。文字列UUIDは、128ビット値の16進表現です。ダッシュは表示目的のためだけにあるので、UUIDは目にやや簡単になります。

String形式のUUIDを外部API、データベース、およびそのようなものなどの外部システムに渡すときは注意してください。彼らはダッシュがあることを期待しているかもしれません。

99
Malt

ホワイトハウスに電話したいとしましょう。電話番号は(202)456-1111です。その電話番号からすべてのダッシュとかっこを削除すると、2024561111のままになります。これを行う過程で情報を失うことはありませんでした。読みにくくなるようにフォーマットを変更しただけです。この番号を電話にパンチしても、電話システムは最初の3桁が市外局番であり、次の7桁がメイン番号であることを認識しているため、電話は引き続き適切に行われます。

同様に、UUIDのダッシュは、電話番号の余分な句読点のようなものです。これは、人間が基礎となる大きな数字を読みやすくするために含まれています。 UUIDでは、その番号は128ビット長で16進数で記述されているため、電話番号とは異なり、「明らかに」番号は少なくなりますが、基本的な原則は同じです。ダッシュを削除しても番号は変更されないため、セキュリティには影響しません。

さて、mightが起こるのは、そうするとプラットフォーム間のフォーマットの互換性が損なわれるということです。電話番号の例えに戻りましょう。私が使用した一部のWebサイトでは、電話番号として2024561111を入力できません。彼らは、(202)456-1111のように、スペース、ダッシュ、括弧を入れることを主張します。 (私はそのようなサイトのファンではありませんが、それは別の話です。)UUIDの文字列表現を他のプロセスまたはサービスに渡す必要がある場合、UUIDからダッシュを削除することは潜在的に問題になる可能性がありますコンマを含む完全なフォーマット。

45
templatetypedef

適切に形成されたUUIDのダッシュは、文字列にランダムに配置されません-それはRFCで詳述されている特定の形式です- http://www.ietf.org/rfc/rfc4122.txt

したがって、ダッシュを削除しても、UUIDの一意性には影響しません。

ただし、UUIDの一部としてダッシュがUUIDとして検証されることを期待するライブラリで問題が発生する場合があります。

なぜそれらを削除したいのですか?

10
HorusKol

javadoc を読むと、文字列がどのように作成されているかを確認できます。

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>

したがって、-を削除しても問題ありません。必要に応じて後で正しい位置に再挿入するか、同じ情報を含むUUIDオブジェクトを再作成できます。

一意性について: IDの一意性

9
assylias

UUIDは128ビットの数値です。

ハイフン付きの16進数形式は、人間が消費するための表示レンダリングにすぎません。これはいくつかの可能な表示レンダリングの1つであり、表示形式は、ハイフンの有無にかかわらず、UUID自体ではありません。

8
Jim Garrison

UUIDは128ビットの数値です。数字Mの4ビットはUUIDバージョンを示し、数字Nの1〜3ビットはUUIDバリアントを示します。 UUIDのバイナリエンコーディングはシステムによって異なります。多くのシステムは、UUIDを完全にビッグエンディアン形式でエンコードします。

1
Stefano