タイプ 3 およびタイプ 5 の UUID は、ハッシュを UUIDに詰め込む手法にすぎません。
- タイプ 1MAC address : +datetimeを 128 ビットに詰め込む
- タイプ 3MD5 hash : anを 128 ビットに詰め込む
- タイプ 4random data : 128 ビットに詰め込む
- タイプ 5SHA1 :ハッシュを 128 ビットに詰め込む
- タイプ 6 :シーケンシャル UUID の非公式なアイデア
編集:非公式のタイプ6には公式のrfcがあります
SHA1 ハッシュは 160 ビット (20 バイト) を出力します。ハッシュの結果は UUID に変換されます。
SHA1 からの 20 バイトのダイジェストを使用:
SHA1 Digest: 74738ff5 5367 e958 1aee 98fffdcd1876 94028007
UUID (v5): 74738ff5-5367-5958-9aee-98fffdcd1876
⭡ ⬑first two bits set to 1 and 0, respectively
╰─low nibble is set to 5, to indicate type 5
何をハッシュしますか?
あなたはおそらく、私が何をハッシュすることになっているのか疑問に思っているでしょう. 基本的に、次の連結をハッシュします。
sha1( NamespaceUUID+ AnyString);
名前の競合を防ぐために、文字列の前にいわゆる名前空間を付けます。
UUID RFCでは、次の4 つの名前空間が事前に定義されています。
NameSpace_DNS
: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
NameSpace_URL
: {6ba7b811-9dad-11d1-80b4-00c04fd430c8}
NameSpace_OID
: {6ba7b812-9dad-11d1-80b4-00c04fd430c8}
NameSpace_X500
:{6ba7b814-9dad-11d1-80b4-00c04fd430c8}
したがって、一緒にハッシュすることができます:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");
次に、RFC は次の方法を定義します。
- SHA1 から 160 ビットを取得します
- それを128ビットのUUIDに変換します
基本的な要点は、最初の 128 ビットのみを取得5
し、タイプレコードに a を詰め込み、clock_seq_hi_and_reserved
セクションの最初の 2 ビットをそれぞれ 1 と 0 に設定することです。
その他の例
いわゆるNameを生成する関数ができたので、関数を (疑似コードで) 持つことができます。
UUID NameToUUID(UUID NamespaceUUID, String Name)
{
//Note: All code on stackoverflow is public domain - no attribution required.
Byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes());
Uuid result;
//Copy first 16-bytes of the hash into our Uuid result
Copy(hash, result, 16);
//set high-nibble to 5 to indicate type 5
result[6] &= 0x0F;
result[6] |= 0x50;
//set upper two bits to "10"
result[8] &= 0x3F;
result[8] |= 0x80;
return result;
}
(注: システムのエンディアンは、上記のバイトのインデックスに影響を与える可能性があります)
これで、電話をかけることができます:
uuid = NameToUUID(Namespace_DNS, 'www.stackoverflow.com');
uuid = NameToUUID(Namespace_DNS, 'www.google.com');
uuid = NameToUUID(Namespace_URL, 'http://www.stackoverflow.com');
uuid = NameToUUID(Namespace_URL, 'http://www.google.com/search&q=rfc+4112');
uuid = NameToUUID(Namespace_URL, 'http://stackoverflow.com/questions/5515880/test-vectors-for-uuid-version-5-converting-hash-into-guid-algorithm');
さて、あなたの質問に戻ります
バージョン 3 およびバージョン 5 の UUID の場合、追加のコマンド ライン引数の名前空間と名前を指定する必要があります。名前空間は、文字列表現の UUID か、内部で事前定義された名前空間 UUID の識別子です (現在知られているのは、"ns:DNS"、"ns:URL"、"ns:OID"、および "ns:X500" です)。名前は任意の長さの文字列です。
名前空間は任意の UUID です。事前定義されたものの1つにすることも、独自のものを作成することもできます。たとえば、1 :
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
名前は任意の長さの文字列です。
名前は、名前空間に追加し、ハッシュして UUID に詰め込みたいテキストです。
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'screwdriver');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'toothbrush');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'broomstick');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'orange');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'axe handle');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'impulse body spray');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'iPod Touch');