汎用一意識別子(英語: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