유형 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'의 처음 두 비트는 이미 각각 1과 0이므로 효과가 없습니다).
나는 무엇을 해시합니까?
내가 해시해야하는 것이 무엇인지 궁금 할 것입니다. 기본적으로 다음과 같은 연결을 해시합니다.
sha1([NamespaceUUID]+[AnyString]);
이름 충돌을 방지하기 위해 소위 네임 스페이스 를 문자열 앞에 붙 입니다.
UUID RFC는 당신을 위해 네 개의 네임 스페이스를 정의합니다 사전 :
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 비트 재료 A를 수행하는 5
에 형 기록하고 처음 두 비트 세트 clock_seq_hi_and_reserved
를 각각 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');
참고 : 공개 도메인으로 공개 된 모든 코드. 귀속이 필요하지 않습니다.