UUID Javaクラスのソースコード解析

汎用一意識別子(英語:UUIDと呼ばれる汎用一意識別子)ソフトウェアの標準的な構造である、また、組織分散コンピューティング環境の分野ではフリーソフトウェア財団の一部です。
UUIDの目的は、分散システムのすべての要素を作ることであり、中央制御端末によって行わ指定せずに固有の識別情報、識別情報を有することができます。このように、誰もが他の人と競合しないUUIDを作成することができます。
UUID基は、16桁で構成されている(また、128としても知られる)16ビットの文字列で、理論的には約3.4×1038から216 = 2128×8、等しい実際の発生UUIDの総数です。UUIDは、ナノ秒あたり1000000000000を生成する場合には、それはすべてのUUIDを実行するために、100億年かかります。その再現性を検討する必要はありません。
UUID標準パターン16は、5つのセクション、8-4-4-4-12 32の文字の形に分割32桁、ハイフン含ま「 - 」との合計36ビットを、私たちは最初に除去することができUUID、その後、 " - "を除去しました。

輸入java.util.UUID。
輸入org.apache.commons.lang3.RandomStringUtils。

パブリック クラスRandomUtils {
     パブリックRandomUtils(){ 
    } 

    パブリック 静的文字列generateTicket(){ 
        文字列のチケット = UUID.randomUUID()のtoString()。
        返す ticket.replaceAllを( " - "、 "" ); 
    } 

    パブリック 静的文字列generateRandomString(int型の数){
         返す(カウントRandomStringUtils.randomを)。
    } 

    公共の 静的文字列generateRandomNum(int型のカウント数){
         返す(、カウントRandomStringUtils.randomを)。
    } 

    パブリック 静的文字列generateRandomFileName(){
         戻り String.join( ""、generateTicket()、generateRandomStringを(6 ))。
    } 
}

 

        < 依存> 
            < groupIdを> org.apache.commons </ groupIdを> 
            < たartifactId >コモンズ-lang3 </ たartifactId > 
        </ 依存関係>

 





パブリック 静的 ボイドメイン(文字列[]引数){
     バイト [] B = {0 }。
    System.out.println(UUID.randomUUID())。
    System.out.println(UUID.randomUUID())。
    System.out.println(UUID.nameUUIDFromBytes(b)参照)。
    System.out.println(UUID.nameUUIDFromBytes(b)参照)。
}

上部は、以下のコードである結果であります

8844-83c9a6d22aa6-Feb860b4-9bc2-4bab
09289276-0af0-4ee8-9e14-E7a0df30aeb8
93b885ad-Fe0d-3089-8df6-34904fd59f71
93b885ad-Fe0d-3089-8df6-34904fd59f71

もっと明白randomUUID()はまだ繰り返されていないで、

しかしnameUUIDFromBytesは()を繰り返してきました

分析:同一のバイト[]は、結果は同じでなければならない返すように参照ソースは、バイト[]生成されたUUIDに係るバイト[]が生成されるMD5のUUID、すなわち、です。



記事のディレクトリ
の一つ、説明
の例を使用して、2を
概説3つの原則
パース4またはソースコード
5賢いけど役に立たない
VIは、参照して
説明する、
ウィキペディア
UUIDを満たすために特定のフォーマットである8-4-4-4-12これをなど、次のUUIDなどの形式:

6b349832-0470-4692-befd-6037b280bbc5

UUID 32個の(ハイフンなし含まない)の英数字は、各キャラクタは、16進数(0〜F)です。UUIDは、いくつかの構造を有します:

注:16進数ニブルと、バイトは、2つの半バイトに等しい、1バイトは8ビット、4ビットに等しいニブルに等しいです。
UUIDによって生成されました:

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

「バージョン2」UUID(通常はユーザーまたはグループID)であり、識別子に基づいて、ノードID生成時刻、

「バージョン3」と「バージョン5」のハッシュ(ハッシュ)名前空間(名前空間)によって生成された確信UUID識別子および名前。

「バージョン4」UUIDは、ランダムまたは擬似乱数を用いて生成しました。

第二に、例を使用して

パブリック 静的 ボイドメイン(文字列[]引数){ 
        文字列UUID = "" ; 
        UUID = 。UUID.randomUUID()のtoString(); 
        System.out.println(UUID)。
    }

結果:

60cc1ff0-4b30-4e35-a0a6-940934ac756b

はい、Javaの中で生成された  UUID  というシンプルです。

第三に、原則は概説します

パブリック 静的 ボイドメイン(文字列[]引数){
         バイト [] =のRANDOMBYTES 新しい新しい バイト [16]; // 配列の各要素は、ランダムな16バイトを生成する必要がある、0である 
        のSecureRandomのSecureRandom = 新しい新;のSecureRandom()
        のSecureRandomを。 engineNextBytes(RANDOMBYTES)
        のSystem.out.println(DatatypeConverter.printHexBinary(RANDOMBYTES)); 


        / ** 
         * RFC 4122の仕様を満たすために、それは16バイトのランダムデータのいくつかのパラメータを設定する必要があります。ここでは、ランダムなUUIDを生成するために取る
         ランダムに生成された「バージョン4」UUID *。他のUUIDと同様に、4ビットが「バージョン4」を示す、2ビットまたは変異体(バリアント)を示すための3ビット(10又は110、それぞれ、変異体1及び2)。
         所定のビットのUUID 6つの変異体及びバージョンを有する*従って、変異のために(すなわち、UUIDのほとんど)、ランダムな「バージョン4」、ランダムに生成された、「バージョン4」変異体1の部分122 UUIDを残し122は、2の総電力であってもよいです。
         *「バージョン4」バリアント2 UUIDおそらく半分の(従来のGUID)と、少なくとも1つのランダムビットが利用可能であるため、3ビットの可変消費。
         * / 

    } 
}

結果:

82D68D2051EAF9610D36C33642E02594

16バイトのアレイサイズ(16進数を32個の文字に変換される)を生成する
(各要素によって生成された初期のアレイが0なので)配列割り当てのために
、ここで実際には、ユニークなIDが作成されます。UUIDは、単に特定の仕様だけでなく、設定の一部によって生成された結果を満たすことができます。セットバージョンとして、バリアントを提供します。最後に、私はjavax.xml.bindのパッケージの下DatatypeConverterを通じて進方法でバイトの私達の配列を出力します。

第四に、ソース解析
UUID

パブリック 静的UUID randomUUID(){ 
        SecureRandomのNG = Holder.numberGenerator; // ランダムバイト配列型を生成します。

        バイト [] = RANDOMBYTES 新しい新しい バイト [16]; //は16バイト配列サイズ生成 
        ng.nextBytes(RANDOMBYTESを); // バイトのランダムな値を割り当てます。実際には、呼び出しがengineNextBytesです。
        
        // UUIDは、特定の仕様を満たすだけでなく、設定の一部によって生成された結果です。セットバージョンとして、変異提供 
        ; [6] =&0x0FのRANDOMBYTESを   / * クリアバージョン         * / 
        [RANDOMBYTES。6] | = 0x40の;   / * 。SET 4版に      * / 
        [RANDOMBYTES。8] =&は0x3Fは、   / * クリアバリアント        * / 
        RANDOMBYTES [ 8] | = 0x80を;  / * IETFバリアントに設定   * / 
        戻る 新しいUUID(RANDOMBYTESを)。
    }

 

プライベート UUID(バイト[]データ){
         ロング MSB = 0 ;
         ロング LSB = 0 ;
         アサート data.length == 16: "データは、長さが16バイトである必要があります" ためINT。I = 0;私は<8; I ++は// なぜ&0xffの?負またはバイト、文字の短い&intに変換さによるものではない
             // 限りタイプ実行、64 |演算子は、0補数演算である必要はない 
            =(MSB << 8 MSB )|(データ[I]&0xFFで);
         のためint型 I = 8;私は<16; I ++。 
            LSB =(LSB << 8)|(データ[I]&0xFFで。);
         この.mostSigBits = MSB。
        この .leastSigBits = LSB。
    }

2 long型の変数mostSigBits、UUIDを保持するleastSigBitsとJavaでUUID。そこに注意すべきで0xff、これは避けるためにあることを|負の数を。ではない説明するために|負の数、私は例を与えます:

 

 

そして最後に、予期せぬ事態につながります

五、賢いけど役に立ちません

1、長いターン進

長い X = 15L 
文字列TEMP = Long.toHexString(X)。
System.out.println(TEMP)。

結果:F

2進数のバイト配列

バイト [] RANDOMBYTESの= {15,14,12,11、-6 }。
System.out.println(DatatypeConverter.printHexBinary(RANDOMBYTES))。

結果:0F0E0C0BFA

VI。参考文献

ウィキペディア
16進数の文字列出力にJAVAバイト配列

https://blog.csdn.net/wobushixiaobailian/article/details/86065041

 

おすすめ

転載: www.cnblogs.com/softidea/p/11448263.html