Guid.NewGuid ()가 Guid.Empty인지 확인하는 것이 가치가 있습니까?


28

다음 패턴으로 작업하는 프로젝트 중 하나에서 상당히 정기적으로 볼 수 있습니다.

var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
    guid = Guid.NewGuid().ToString();
}

GUID가 독창적이라고 보장 되지는 않지만 MSDN 설명서에 따라 생성 된 GUID가 0수 있다는 것을 이해하지만 실제로 계산상의 의미와 개발자의 생각에 대한 사이클 테스트를 보낼 가치가있는 실용적인 고려 사항입니까? ?


1
이 패턴이 반복적으로 나타나면 아마도 유틸리티 방법이 순서대로되어 있습니까? 이와 같은 코드 청크를 반복하면 결코 발생하지 않고 발생하더라도 중요하지 않은 에지 케이스를 확인한다는 사실보다 더 큰 문제처럼 보입니다.
psr

27
그 코드는 악어를 멀리하기 위해 존재합니다. 코드를 작성하는 악어가 있습니까? 아니? 그렇다면 분명히 작동합니다!
Eric Lippert

3
어떤 경우이든, 나는 이것을 한동안 수행 할 것입니다.
Arturo Torres Sánchez

3
왜 지구상에서 guid를 현으로 바꾸고 비교 하는가? 그들은 스스로 잘 비교합니다.
Andy

2
문서는 업데이트했다 : "반환의 GUID가 동일하지 Guid.Empty로 보장된다."
sschoof

답변:


33

Guid.Empty를 확인할 가치가 없다고 제안합니다. 에 대한 문서 Guid.NewGuid 어떤 이유로 언급에 대한

새로운 Guid의 가치가 모두 0이거나 다른 Guid와 같을 확률은 매우 낮습니다.

Guid.NewGuid는 Win32 API CoCreateGuid 의 래퍼이며 모든 0을 반환하는 것에 대해서는 언급하지 않습니다.

레이몬드 첸 더 나아가 것을 제안,

CoCreateGuid를 올바르게 구현하면 GUID_NULL을 생성 할 수 없습니다.

그래서, 나는 그것에 대해 걱정하지 않을 것입니다. 나는 Guid.NewGuid 문서가 왜 그것을 언급했는지 추측하지 않을 것입니다.


1
"어떤 이유로 GUID_NULL을 생성 했더라도 고유성으로 인해 한 번만 수행해야합니다! (이 버그를 테스트에서 강제로 시도하면 프로덕션에서 절대 발생하지 않을 것이라고 확신 할 수 있습니다." ) "-좋습니다!
razethestray

3
@razethestray-내 카지노에서 원하는 모든 것을 내기 할 수 있습니다.
JeffO

10
@JeffO 당신에 농담, 그는 집에서 37 번 회전 확인하고 오지 않은 사람에 그의 모든 돈을 넣어 것입니다.
Random832

xamarin에서 Guid.NewGuid가 때때로 실패하고 빈 상태로 계속 반환됩니다 (ef 코어에서 guid가 자동으로 할당 될 때) 이유를 알 수 없었습니다
Karan Harsh Wardhan

@KaranHarshWardhan 나는 당신이 그것을 버그로보고하기를 바라고 있습니다. :)
Curt Nichols

43

Guid.NewGuid() == Guid.Empty당신이 지구상에서 가장 어려운 복권을 얻은 것을 발견 하면. 고유성 또는 충돌 검사를 방해하지 마십시오. 그렇게 할 필요가없는 것은 guids를 위한입니다 . 나는 당신에게 수학을 아끼지 않을 것입니다. 그것은 웹의 모든 곳에 있습니다.

또한 Windows guid는 항상 "숫자"가 1 4입니다. guid에는 어떤 구조가 있습니다.

게시 한 코드 스 니펫은 Guid변수 를 초기화하는 것을 잊어 버린 것으로 보입니다 Guid.Empty. 그는 실수 Guid.NewGuid()로 원인을 식별 했습니다. 이제 그는 이것을 미신적으로 영원히 믿게 될 것입니다.

어쨌든 이것은 잘못된 질문입니다. 나는 당신의 코드가 그림 Guid.Empty뿐만 아니라 독창성에도 의존한다고 확신합니다 . 이 while루프는 고유성을 강제하지 않습니다. 지도는 조정 없이 고유 한 가치를 창출하기 위해 존재합니다 . 이것이 그들의 유스 케이스입니다.


5
"질문이 잘못되었습니다"+1 그것은 독창성에 관한 것입니다. 그것이 정말로 중요한 전부입니다.
토마스 스트링거

1
@rjzii이 답변을 허용되는 답변으로 만드십시오!
emcor

18

메소드소스 코드를Guid.NewGuid 살펴보십시오 .

public static Guid NewGuid() {
    Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
    ...
}

코드 계약을 보시겠습니까? 이 Guid.NewGuid메소드는 빈 GUID를 제공하지 않습니다.


2
다른 답변에 누락 된 내용이 언급되어있어 왜 다운 보트를 받았는지 잘 모르겠습니다. 코드 계약의 존재는 꽤 좋은 보증이며 원래 질문에 대한 훌륭한 답변을 제공합니다. 실제 구현을 살펴 보려면 +1입니다.
Arseni Mourzenko

코드 계약을 좋아합니다.
Andy

10

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


3
.NET GUID에 항상 4가 포함되는 이유는 무엇입니까?
Arturo Torres Sánchez

9
@ ArturoTorresSánchez : 귀하의 질문에 대한 답변과 GUID에 대한 더 많은 재미있는 사실에 대해서는 여기에서 시작하는 일련의 기사를 참조하십시오. ericlippert.com/2012/04/24/guid-guide-part-one Luke는 사용자의 편의를 위해 이미 파트 3에 연결되어 있습니다. 짧은 대답은 : 버전 4의 GUID는 항상 4 등
에릭 Lippert의

@EricLippert는 아주 좋은 기사입니다 :)
사랑하지 않음 그들의 사람들이 아닙니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.