UUID ประเภทที่ 3 และประเภทที่ 5 เป็นเพียงเทคนิคในการบรรจุแฮชลงใน UUID
- ประเภทที่ 1: บรรจุที่อยู่ MAC + วันที่และเวลาเป็น 128 บิต
- ประเภทที่ 3 : บรรจุแฮช MD5 เป็น 128 บิต
- แบบที่ 4: บรรจุข้อมูลแบบสุ่มเป็น 128 บิต
- ประเภทที่ 5 : บรรจุแฮช SHA1 เป็น 128 บิต
- ประเภทที่ 6: แนวคิดที่ไม่เป็นทางการสำหรับ UUID ตามลำดับ
แฮช SHA1 เอาต์พุต 160 บิต (20 ไบต์); ผลลัพธ์ของแฮชจะถูกแปลงเป็น UUID
ด้วยแฮช 20 ไบต์จาก SHA1:
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' มีค่า 1 และ 0 อยู่แล้วตามลำดับดังนั้นจึงไม่มีผล)
ฉันแฮชอะไร
คุณคงสงสัยว่าฉันควรจะแฮชอะไร โดยทั่วไปคุณแฮชการเชื่อมต่อของ:
sha1([NamespaceUUID]+[AnyString]);
คุณนำหน้าสตริงของคุณด้วยเนมสเปซที่เรียกว่าเพื่อป้องกันความขัดแย้งของชื่อ
UUID RFCก่อนกำหนดสี่ namespaces สำหรับคุณ:
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 จะกำหนดวิธีการ:
- รับ 160 บิตจาก SHA1
- และแปลงเป็น UUID 128 บิต
สาระสำคัญพื้นฐานคือรับเฉพาะ 128 บิตแรกยัด a 5
ในเร็กคอร์ดtypeจากนั้นตั้งค่าสองบิตแรกของclock_seq_hi_and_reserved
ส่วนเป็น 1 และ 0 ตามลำดับ
ตัวอย่างเพิ่มเติม
เมื่อคุณมีฟังก์ชันที่สร้างชื่อที่เรียกว่าคุณสามารถมีฟังก์ชัน (ในรหัสหลอก):
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;
}
(โปรดทราบว่า endian-ness ของระบบของคุณอาจส่งผลต่อดัชนีของไบต์ข้างต้น)
คุณสามารถโทรได้:
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');
ตอนนี้กลับไปที่คำถามของคุณ
สำหรับ UUID เวอร์ชัน 3 และเวอร์ชัน 5 จะต้องกำหนดเนมสเปซและชื่ออาร์กิวเมนต์บรรทัดคำสั่งเพิ่มเติม เนมสเปซเป็น UUID ในการแสดงสตริงหรือตัวระบุสำหรับ UUID ของเนมสเปซที่กำหนดไว้ล่วงหน้าภายใน (ปัจจุบันรู้จักคือ "ns: DNS", "ns: URL", "ns: OID" และ "ns: X500") ชื่อนี้เป็นสตริงที่มีความยาวโดยพลการ
namespaceคือสิ่งที่คุณชอบ 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');
หมายเหตุ : รหัสใด ๆ ที่เผยแพร่สู่สาธารณสมบัติ ไม่จำเป็นต้องแสดงที่มา