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.