UUID Tipe 3 dan Tipe 5 hanyalah teknik memasukkan hash ke dalam UUID.
- Tipe 1: isi alamat MAC + tanggal waktu menjadi 128 bit
- Tipe 3 : memasukkan hash MD5 ke dalam 128 bit
- Tipe 4: memasukkan data acak ke dalam 128 bit
- Tipe 5 : isi hash SHA1 menjadi 128 bit
- Jenis 6: ide tidak resmi untuk UUID berurutan
Sebuah hash SHA1 menghasilkan 160 bit (20 byte); hasil hash diubah menjadi UUID.
Dengan hash 20-byte dari 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
(Perhatikan bahwa dua bit pertama dari '9' masing-masing sudah menjadi 1 dan 0, jadi ini tidak berpengaruh).
Apa yang saya hash?
Anda mungkin bertanya-tanya apa yang harus saya hash. Pada dasarnya, Anda mencirikan rangkaian:
sha1([NamespaceUUID]+[AnyString]);
Anda memberi awalan string Anda dengan apa yang disebut namespace untuk mencegah konflik nama.
The UUID RFC pra-mendefinisikan empat ruang nama untuk Anda:
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}
Jadi, Anda bisa melakukan hash bersama:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");
RFC kemudian menjelaskan cara:
- ambil 160 bit dari SHA1
- dan mengubahnya menjadi 128 bit UUID
Inti dasarnya adalah hanya mengambil 128 bit pertama, memasukkan a ke 5
dalam tipe record, dan kemudian menetapkan dua bit pertama dari clock_seq_hi_and_reserved
bagian tersebut masing-masing ke 1 dan 0.
Lebih banyak contoh
Sekarang Anda memiliki fungsi yang menghasilkan apa yang disebut Nama , Anda dapat memiliki fungsi tersebut (dalam pseudo-code):
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;
}
(Perhatikan bahwa endian-ness sistem Anda dapat memengaruhi indeks dari byte di atas)
Anda dapat melakukan panggilan:
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');
Sekarang kembali ke pertanyaan Anda
Untuk UUID versi 3 dan versi 5, namespace argumen baris perintah tambahan dan nama harus diberikan. Namespace adalah UUID dalam representasi string atau pengenal untuk UUID namespace yang telah ditentukan sebelumnya (saat ini dikenal adalah "ns: DNS", "ns: URL", "ns: OID", dan "ns: X500"). Nama adalah string dengan panjang sembarang.
The namespace adalah apa pun UUID Anda seperti. Ini bisa menjadi salah satu yang ditentukan sebelumnya, atau Anda bisa membuatnya sendiri, misalnya:
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
Nama adalah string dengan panjang sembarang.
Namanya hanyalah teks yang ingin Anda tambahkan ke namespace, lalu di-hash, dan dimasukkan ke dalam 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');
Catatan : Kode apa pun yang dirilis ke domain publik. Tidak diperlukan atribusi.