JavaでGUIDを作成する


回答:


347

Java 5以降にバンドルされているUUIDクラスをご覧ください。

例えば:


7
Kaleb Braseeのような例を含めると、よい答えが得られます。
Zero3 '11年

AndroidStudio 2.3およびAPIレベル21以降で動作します。たぶんさらに戻ってきます。
raddevus

5
TL; DR ... "UUID uuid = UUID.randomUUID();"
Aviram Fireberger 2018

419

java.util.UUID.randomUUID();


2
それは繰り返し返すことができますか?Guidが繰り返されることは決してないからです
天使

4
@angelはい、UUID.randomUUIDメソッドが複製を返すことは理論的には可能ですが、これはまったく現実的な問題ではありません。Oracle / OpenJDKの実装では、暗号的に強力な乱数ジェネレータが使用されます。それと、UUIDの非常に多くのビットによって与えられる天文学的な範囲を考えると、アプリで何百万ものそのような値を生成でき、それでも十分にスリープできます。他のバリアントのいずれかを使用すると、「空間と時間」、[1] MACアドレスまたは名前、[2]現在の日時が制約として使用されるため、衝突の可能性がさらにゼロに近づきます。
バジルブルク2015

@RenniePetええと、あなたがその偏執狂で、新しいIDを作成するときに既に使用されているIDのリストにアクセスできた場合は、リスト内にないID whileを取得するまで、新しいIDを生成するだけです:p
Nyerguds

2
Oracle暗号乱数ジェネレーターは、通常、ランダムシードを持つPRNGです。ランダムシードは、通常、OSによって提供される「エントロピー」のソースを使用して取得されます。そのソースを低下または侵害できる場合は、暗号乱数ジェネレータが同じ番号を生成する可能性が高くなります。一部の(仮想化された)プラットフォームでは、OSがエントロピーを使い果たす可能性があることにも注意する必要があります。これを回避するための「危険なハック」がありますが、エントロピーの品質を低下させる必要があります。
Stephen C

これは単なる学術的な問題ではありません。私は(見ている未検証!!誰かがいることを)主張でした乱数ベースのUUIDが一意でないとの問題に実行します。
スティーブンC

32

必要なUUIDの種類によって異なります。

  • 標準Java UUIDクラスは、バージョン4(ランダム)UUIDを生成します。(UPDATE - バージョン3(名前)のUUIDも生成することができます。)それはそれらを生成することができないけれどもそれはまた、他の変異体を処理することができます。(この場合、「ハンドル」とUUIDlong、からのインスタンスbyte[]またはString表現を構築し、適切なアクセサを提供することを意味します。)

  • JavaのUUIDジェネレータ(JUG)実装の趣旨「で定義されたUUIDの全て3 『公式』のタイプをサポートするためにRFC-4122を RFCが実際に4種類を定義し、第五種類に言及しているのに...」。

UUIDのタイプとバリアントの詳細については、Wikipediaに適切な要約があります。詳細はRFC 4122とその他の仕様に記載されています。


1
完全に真実ではありませんが、名前ベース(バージョン3)のUUIDを生成することもできますUUID.nameUUIDFromBytes(byte[] name)
DennisK

私は修正された立場です。私が言うのJavadocの説明に頼っていた「ための静的ファクトリー取得指定されたバイト配列に基づく、タイプ3(名前ベース)UUIDを。」
スティーブン・C

投稿は正確ではないと思います。UUIDのJavaドキュメントは、コンストラクターは、2型の変異体ではなく、ランダムに生成述べます。タイプ3の場合はを使用しますpublic static UUID nameUUIDFromBytes(byte[] name)。タイプ4用public static UUID randomUUID()。タイプ1はJDKクラスでは使用できません。
slartibartfast 2017

いいえ、私はそれをかなり正しく理解したと思います。javadocsの状態:「コンストラクターはUUIDの任意のバリアント(以下で説明)の作成を許可しますが」タイプ1を含む4つのバリアントを以下にリストします。実際、javadocのclockSequence()
Stephen C

27

例としてMark Byersの回答を拡張するだけです。

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

他の答えは正解です。特に、これスティーブンCによるものです。

Javaの外部に到達する

セキュリティ上の理由により、Java内でのUUID値の生成はバージョン4(ランダム)に制限されています。

UUIDの他のバージョンが必要な場合は、次の呼び出しにより、JavaアプリがJVMの外部に到達してUUIDを生成する方法があります。

  • コマンドラインユーティリティ
    ほぼすべてのオペレーティングシステムにバンドルされています。
    たとえばuuidgen、Mac OS X、BSD、およびLinuxにあります。
  • データベースサーバーJDBC
    使用して、データベースサーバーで生成されたUUIDを取得します。たとえば、拡張機能はしばしばPostgresにバンドルされています。その拡張機能は、バージョン1、3、および4の値と、さらにいくつかのバリエーションを生成できます。
    uuid-ossp
    • uuid_generate_v1mc() –バージョン1のUUIDを生成しますが、コンピューターの実際のMACアドレスではなくランダムなマルチキャストMACアドレスを使用します。
    • uuid_generate_v5(namespace uuid, name text) –バージョン5のUUIDを生成します。これは、ハッシュ方式としてSHA-1が使用されることを除いて、バージョン3のUUIDと同様に機能します。
  • Webサービス
    たとえば、UUIDジェネレーターは、バージョン1と3、およびnil値GUIDを作成します

3
私はあなたの答えにいくつかの問題があります:最初に、標準のJavaライブラリからのみV4を取得できることはすでに間違っていることが示されていました(V3も可能です)。次に、標準のライブラリ以外にJavaにはオプションがないように聞こえますが、それには「セキュリティ上の懸念があるため」の手が波打っています。そして最後に、Java内でそれを実行する方法がたくさんある場合(たとえば、作成の一環として) SQLサーバーのレコード)。
DennisK 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.