Ruby 용 UUID 생성기 / 파서를 작성 했으므로이 주제에 대해 합리적으로 잘 알고 있다고 생각합니다. 네 가지 주요 UUID 버전이 있습니다.
버전 4 UUID는 기본적으로 암호화 보안 난수 생성기에서 가져온 임의의 16 바이트에 불과하며 UUID 버전 및 변형을 식별하기위한 비트 트위들 링이 있습니다. 이들은 충돌 할 가능성이 극히 적지 만 PRNG를 사용하거나 정말, 정말, 정말, 정말, 정말, 정말 정말 불운을 겪는 경우 발생할 수 있습니다.
버전 5 및 버전 3 UUID는 각각 SHA1 및 MD5 해시 함수를 사용하여 네임 스페이스를 이미 고유 한 데이터와 결합하여 UUID를 생성합니다. 예를 들어 URL에서 UUID를 생성 할 수 있습니다. 여기서 충돌은 기본 해시 함수에도 충돌이있는 경우에만 가능합니다.
버전 1 UUID가 가장 일반적입니다. 이들은 네트워크 카드의 MAC 주소 (스푸핑되지 않는 한 고유해야 함)와 타임 스탬프, 일반적인 비트 트위들 링을 사용하여 UUID를 생성합니다. MAC 주소가없는 시스템의 경우 암호화 보안 난수 생성기로 6 노드 바이트가 생성됩니다. 두 개의 UUID가 타임 스탬프가 이전 UUID와 일치 할만큼 충분히 빠르게 생성되는 경우 타임 스탬프는 1 씩 증가합니다. 다음 중 하나가 발생하지 않는 한 충돌이 발생해서는 안됩니다. MAC 주소가 스푸핑되었습니다. 두 개의 서로 다른 UUID 생성 응용 프로그램을 실행하는 하나의 컴퓨터는 정확히 같은 순간에 UUID를 생성합니다. 네트워크 카드가 없거나 MAC 주소에 대한 사용자 수준 액세스 권한이없는 두 대의 컴퓨터에는 동일한 임의 노드 시퀀스가 지정되고 정확히 같은 순간에 UUID를 생성합니다.
현실적으로 이러한 이벤트는 단일 애플리케이션의 ID 공간 내에서 우연히 발생하지 않습니다. 예를 들어 인터넷 규모의 ID를 받아들이거나 ID 충돌시 악의적 인 개인이 악의적 인 작업을 수행 할 수있는 신뢰할 수없는 환경에서 ID를 받아들이지 않는 한 걱정할 필요가 없습니다. 나와 동일한 버전 4 UUID를 생성하는 경우 대부분의 경우 문제가되지 않는다는 점을 이해하는 것이 중요합니다. 귀하와 완전히 다른 ID 공간에 ID를 생성했습니다. 내 응용 프로그램은 충돌에 대해 알지 못하므로 충돌은 중요하지 않습니다. 솔직히 말해서 악의적 인 행위자가없는 단일 애플리케이션 공간에서는 충돌이 발생하기 훨씬 전에 지구상의 모든 생명체가 멸종 될 것입니다. 심지어 버전 4 UUID에서도 마찬가지입니다.
또한 2 ^ 64 * 16은 256 엑사 바이트입니다. 에서와 같이 단일 애플리케이션 공간에서 ID 충돌 가능성이 50 % 발생하기 전에 256 엑사 바이트 상당의 ID를 저장해야합니다.