어느 열심히 일하는 날, 나는 일반적인 .NET의 방법 으로 생성 한 GUID 가 세 번째 블록의 시작 부분에 Guid.NewGuid()
동일한 숫자 4
를 가지고 있음을 발견했습니다 .
efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...
1 초에 한 번씩 10 개가 화면에 나타납니다. 다섯 번째 GUID 직후이 패턴을 계속 주시했습니다. 마지막으로, 마지막 것은 같은 4 개의 비트를 가지고 있었고 나는 운이 좋은 사람이라고 결정했습니다. 나는 집에 돌아 갔고, 나 같은 특별한 사람에게 온 세상이 열려 있다는 것을 느꼈다. 다음 주에 나는 새로운 일을 발견하고 방을 청소하고 부모님에게 전화를 걸었습니다.
하지만 오늘도 같은 패턴에 직면했습니다. 천 번. 그리고 나는 더 이상 선택된자를 느끼지 않습니다.
나는 그것을 봤했고 지금은 알고 UUID 4 예약에 대한 비트 정규 형식 version
및 2 variant
.
다음은 실험 할 스 니펫입니다.
static void Main(string[] args)
{
while (true)
{
var g = Guid.NewGuid();
Console.WriteLine(BitConverter.ToString(g.ToByteArray()));
Console.WriteLine(g.ToString());
Console.ReadLine();
}
}
그러나 여전히 내가 이해하지 못하는 것이 하나 있습니다 (살아가는 방법을 제외하고). 이러한 예약 된 비트가 필요한 이유는 무엇입니까? 내부 구현 세부 사항 노출, 더 많은 충돌 (여전히 걱정할 필요가 없지만 언젠가 ...), 더 많은 자살-하지만 어떤 이점도 보지 못합니다. 내가 찾도록 도와 줄 수 있습니까?
알고리즘을 업데이트하면 해당 번호를 변경할 수 있습니다. 그렇지 않으면 서로 다른 두 알고리즘이 서로 다른 이유로 정확히 동일한 UUID를 생성하여 충돌을 일으킬 수 있습니다. 버전 식별자입니다.
예를 들어 인위적인 단순 UUID 형식을 고려하십시오.
00000000-00000000
time - ip
이제 어떤 이유로 해당 형식을 다음과 같이 변경한다고 가정합니다.
00000000-00000000
ip - time
IP 12.34.56.78을 가진 컴퓨터가 01234567 시간에 첫 번째 방법을 사용하여 UUID를 생성하고 나중에 IP 01.23.45.67을 사용하는 두 번째 컴퓨터가 새로운 방법을 사용하여 시간 12345678에 UUID를 생성 할 때 충돌이 발생할 수 있습니다. 그러나 버전 식별자를 위해 일부 비트를 예약하면 충돌이 발생할 수 없습니다.
값 4는 시간, MAC 주소, pid 또는 기타 종류의 시간 및 공간 식별자의 조합을 사용할 수있는 다른 방법이 아니라 무작위로 생성 된 UUID (따라서 너무 많은 비트가 주어진 충돌 가능성에 의존 함)를 나타냅니다. 고유성을 보장합니다.
관련 사양은 여기를 참조하세요 : https://tools.ietf.org/html/rfc4122#section-4.1.3
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다