GUID 생성은 시간에 따라 다르므로 System.Guid.NewGuid()가 다른 스레드에서 동일한 순간에 여러 번 호출되면 동일한 GUID를 반환 할 수 있습니까?여러 동일한 GUID가 발생할 수 있습니까?
답변
Windows에서 GUID (UUID)는 UuidCreate 인 암호화 난수 생성기에서 생성됩니다. 그들은 RFC 4122의 관점에서 버전 4 UUID입니다. UuidCreateSequential으로 만든 구식 버전 1 GUID를 사용하지 않는 한 타임 스탬프 또는 이더넷 카드는 사용되지 않습니다. 당신이 참조를 가지고있다 -
는 내가 가정하지만, 어디서든 '내 일련 번호'에 대한 언급을 보지 못했다 무엇도 How Random is System.Guid.NewGuid()? (Take two)
아니요, 각 호출마다 변경되는 일련 번호가 있으므로 동일한 시스템의 다른 스레드에서 동시에 여러 번 호출해도 중복 Guids가 생성되지 않습니다.
각 호출마다 증가분을 볼 수있는 눈에 보이는 부분이 있다는 것을 의미하지 않습니다.
Transact-SQL NEWID 함수와 응용 프로그램 API 함수 및 메서드는 네트워크 카드의 ID 번호와 CPU 클럭의 고유 번호를 사용하여 새 uniqueidentifier 값을 생성합니다. 각 네트워크 카드에는 고유 한 식별 번호가 있습니다. NEWID가 반환하는 uniqueidentifier 값은 서버의 네트워크 카드를 사용하여 생성됩니다. 응용 프로그램 API 함수 및 메서드에서 반환 된 uniqueidentifier 값은 클라이언트의 네트워크 카드를 사용하여 생성됩니다.
. 시간이 지나면 어떤 컴퓨터에서도 중복을 생성하지 않습니다. msdn.
스레드가 컴퓨터의 다른 코어에서 실행되고 있지 않으면 주어진 시간에 실제로 하나의 스레드 만 실행됩니다. 따라서 NewGuid() 호출이 같은 시간에 일어날 가능성이 매우 높다고 생각하지 않습니다.
요즘 멀티 코어가 너무 불합리하다고 생각하지 않기 때문에 오늘날의 코드가 어느 시점에 여러 코어에서 실행될 것이라는 점을 분명히 말할 수 있습니다. –
예, 일반적으로 프로세스는 단일 코어에서만 실행됩니다 (스레드가 메모리를 공유하고 동일한 프로세스의 다른 스레드를 실행하는 코어 사이에서 메모리를 전송하는 것이 비용이 많이 들기 때문에).) 적어도, 그게 내가 1 년 내 OS 과정에서 기억하는 것입니다. 나는이 점에서 틀릴 수도있다. – apoorv020
캐시 지역에 대해 스케줄러는 일반적으로 동일한 코어에서 프로세스의 스레드를 유지하는 것을 선호합니다. 그러나 이것은 거의 보장되지 않습니다. 실행 가능한 유일한 스레드는 모두 동일한 프로세스에서 온 것일 수 있습니다. 이것은 서버 응용 프로그램에서 매우 일반적입니다. 스케줄러의 변경 사항에 관계없이 여러 프로세스에서 동시에 GUID를 만들 수 있습니다. –
페이지를 참조하십시오? – billybum
아쉽게도이 일련 번호에 대해 언급 한 기사에 대한 링크가 없지만 Windows에서 Guids를 만드는 핵심 기능인 UuidCreate에 대한 설명서를 보면 (http://msdn.microsoft.com/en/ -us/library/Aa379205), "UUID는이 컴퓨터에서만 유일 함을 보장합니다."라는 메시지가 나타납니다. 분명히 그것은 각 호출에 대해 적어도 하나의 변경 사항이 없으면 그러한 보장을 할 수 없습니다. –
고마워,하지만 아직 완전히 결정적인 것은 아니야. – billybum