유형 3 및 유형 5 UUID는 해시을 UUID에 채우는 기술 일뿐입니다.
- 타입 1 : 128 비트
- 타입 3에 MAC 어드레스, 날짜 충전제 : 128 비트
- 형 (5)에 임의의 데이터를 즈 : 128 비트
- 타입 4로의 MD5 해시 즈 : 128 비트로 SHA1 해시 채우기
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 당신을위한 네 개의 네임 스페이스를 미리 정의
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
형식의 레코드에있는을 입력 한 다음 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;
}
합니다 (엔디안합니다
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');
: 시스템의 -ness 위 바이트의 인덱스)
당신이 가질 수있는 통화에 영향을 미칠 수
지금 다시 질문 버전 3과 버전에 대한
-5 UUID를 추가 명령 행 인수 네임 스페이스와 이름이 부여되어야한다. 네임 스페이스는 문자열 표현의 UUID 또는 내부적으로 미리 정의 된 네임 스페이스 UUID (현재 "ns : DNS", "ns : URL", "ns : OID"및 "ns : X500")에 대한 식별자입니다. 이름은 임의 길이의 문자열입니다.
네임 스페이스 당신이 원하는대로 UUID입니다. 그것은 미리 정의 된 것들 중 하나가 될 수 있습니다, 또는 당신은 이름은 임의의 길이의 문자열입니다
UUID Namespace_RectalForeignExtractedObject = '4d79546f-6e67-7565-496e-486572417373'
: 자신 예컨대을 만들 수 있습니다.
이름은 네임 스페이스에 추가 한 할 단지 텍스트입니다은 다음 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');
주 : 퍼블릭 도메인으로 공개 코드를. 기여가 필요하지 않습니다.
주셔서 감사합니다. 'Namespace_RectalForeignExtractedObject'에 보너스 포인트를 줄 수 있다면 그렇게 할 수 있습니다. – boodle