다음 패턴으로 작업하는 프로젝트 중 하나에서 상당히 정기적으로 볼 수 있습니다.
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
GUID가 독창적이라고 보장 되지는 않지만 MSDN 설명서에 따라 생성 된 GUID가 0 일 수 있다는 것을 이해하지만 실제로 계산상의 의미와 개발자의 생각에 대한 사이클 테스트를 보낼 가치가있는 실용적인 고려 사항입니까? ?
답변
Guid.Empty를 확인할 가치가 없다고 제안합니다. 에 대한 문서 Guid.NewGuid 어떤 이유로 언급에 대한
새로운 Guid의 가치가 모두 0이거나 다른 Guid와 같을 확률은 매우 낮습니다.
Guid.NewGuid는 Win32 API CoCreateGuid 의 래퍼이며 모든 0을 반환하는 것에 대해서는 언급하지 않습니다.
레이몬드 첸 더 나아가 것을 제안,
CoCreateGuid를 올바르게 구현하면 GUID_NULL을 생성 할 수 없습니다.
그래서, 나는 그것에 대해 걱정하지 않을 것입니다. 나는 Guid.NewGuid 문서가 왜 그것을 언급했는지 추측하지 않을 것입니다.
답변
Guid.NewGuid() == Guid.Empty
당신이 지구상에서 가장 어려운 복권을 얻은 것을 발견 하면. 고유성 또는 충돌 검사를 방해하지 마십시오. 그렇게 할 필요가없는 것은 guids를 위한 것 입니다 . 나는 당신에게 수학을 아끼지 않을 것입니다. 그것은 웹의 모든 곳에 있습니다.
또한 Windows guid는 항상 “숫자”가 1 4
입니다. guid에는 어떤 구조가 있습니다.
게시 한 코드 스 니펫은 Guid
변수 를 초기화하는 것을 잊어 버린 것으로 보입니다 Guid.Empty
. 그는 실수 Guid.NewGuid()
로 원인을 식별 했습니다. 이제 그는 이것을 미신적으로 영원히 믿게 될 것입니다.
어쨌든 이것은 잘못된 질문입니다. 나는 당신의 코드가 그림 Guid.Empty
뿐만 아니라 독창성에도 의존한다고 확신합니다 . 이 while
루프는 고유성을 강제하지 않습니다. 지도는 조정 없이 고유 한 가치를 창출하기 위해 존재합니다 . 이것이 그들의 유스 케이스입니다.
답변
메소드 의 소스 코드를Guid.NewGuid
살펴보십시오 .
public static Guid NewGuid() {
Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
...
}
코드 계약을 보시겠습니까? 이 Guid.NewGuid
메소드는 빈 GUID를 제공하지 않습니다.
답변
GUID를 제로 GUID와 비교하여 검사하려는 경우 동일한 논리에 따라 응용 프로그램의 다른 모든 GUID와 비교하여 실사를 수행해야합니다 (제로를 얻을 확률은 확률과 동일해야 함) 앱에서 다른 GUID 가져 오기 *). 당신이 행동하고있는 공리가이 GUID가 독특하다는 것을 증명하기 위해 이것을해야한다.
TLDR; 고유 한 결과를 생성하기 위해 NewGuid ()를 신뢰할 수있는 경우 알려진 GUID를 생성하지 않도록 신뢰할 수도 있습니다.
* 실제로 .NET GUID와 같은 확률은 항상 다음에 적합 {________-____-4___-____-____________}
하므로 NewGuid는 절대 영점을 생성 하지 않습니다.
그냥 재미로 여기 문서 개선을 제안했습니다 : http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid