タイプ3およびタイプ5のUUIDは、ハッシュをUUID に詰め込む手法にすぎません。
- タイプ1:MACアドレス+日時を128ビットに詰める
- タイプ3:MD5ハッシュを128ビットに詰め込む
- タイプ4:ランダムデータを128ビットに詰める
- タイプ5:SHA1ハッシュを128ビットに詰める
- タイプ6:順次UUIDの非公式なアイデア
SHA1ハッシュは160ビット(20バイト)を出力します。ハッシュの結果はUUIDに変換されます。
SHA1からの20バイトのハッシュ:
SHA1 Digest: 74738ff5 5367 e958 9aee 98fffdcd1876 94028007
UUID (v5): 74738ff5-5367-5958-9aee-98fffdcd1876
^_low nibble is set to 5, to indicate type 5
^_first two bits set to 1 and 0, respectively
(「9」の最初の2ビットはすでにそれぞれ1と0であるため、これは効果がないことに注意してください)。
何をハッシュしますか?
あなたはおそらく私がハッシュすることになっているのは何だろうと思っているでしょう。基本的には、次の連結をハッシュします。
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ビットを取る
- そしてそれをUUIDの128ビットに変換します
基本的な要点は、最初の128ビットのみを取得5
し、型レコードにa を詰め込み、clock_seq_hi_and_reserved
セクションの最初の2ビットをそれぞれ1および0に設定することです。
その他の例
いわゆるNameを生成する関数ができたので、関数を(疑似コードで)持つことができます。
UUID NameToUUID(UUID NamespaceUUID, String Name)
{
byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes());
UUID result;
Copy(hash, result, 16);
result[6] &= 0x0F;
result[6] |= 0x50;
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何でもあります。事前定義されたものにすることも、独自に作成することもできます。例:
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');
注:パブリックドメインにリリースされたコード。帰属は必要ありません。