Guid.NewGuid () 대 new Guid ()


347

차이 무엇 Guid.NewGuid()new Guid()?

어느 것이 선호됩니까?


6
@ClintonWard 저는 C #과 @ Bob2Chiv를 처음 접했고 지금 프로젝트를 실행할 수 없어서 궁금했습니다.
OscarRyz

6
@OscarRyz-C #에서 코드를 빠르게 테스트하려면 LinqPad를 사용 합니다 .
DaveShaw

5
실제로이 질문은 혼란스럽고 실제로 "0000000-0000 .."이 최선의 기본값이 아니기 때문에 관련이 있다고 생각합니다. 방금 NewGuid () 대신 New Guid ()가 호출 되었기 때문에 클라이언트가 시스템에 로그인 할 수없는 문제가 발생했습니다.
Michiel Cornille

3
@DaveShaw-LinQPad는 훌륭하고 많이 사용합니다. 그러나 Visual Studio에는 이제 이러한 종류의 테스트에 매우 유용한 "C # Interactive"창이 있습니다.
Mark Meuer

1
@MichielCornille 방금 느낌을 알게되었습니다 ...
Jins Peter

답변:


583

new Guid() "빈"all-0 guid를 만듭니다 (00000000-0000-0000-0000-000000000000은 그다지 유용하지 않습니다).

Guid.NewGuid() 고유 한 값으로 원하는 실제 guid를 만듭니다.


26
빈 UUID는 실제로 매우 유용합니다. 특별한 가치를 제공합니다.
Jon Hanna

103
참고로, new Guid()와 같습니다 Guid.Empty.
Steve Guidi

30
@JonHanna 모든 guid는 특별한 가치를 만들어냅니다. 불행히도, 빈 것은 충돌하는 경향이 있습니다. 빈 guid가 유용하지만, 일반적으로 초기화되지 않은 것을 나타내는 데 동의합니다.
MarkPflug

5
비어있는 것은 충돌하기 때문에 매우 유용합니다. 알려진 특수 값과 충돌하지 않는 특수 값은 쓸모가 없습니다.
Jon Hanna

5
나는 무언가가 초기화를 기다리고 있거나 다른 알려진 상태에 있음을 나타내는 경우와 비교할 때 "알려진 guid"를 만드는 것에 동의한다고 생각합니다. 개인적으로 나는 null 값을 사용하고 싶지만 누군가가 특정 시점에 "특별한"guid가 필요할 수 있으며 모든 0 guid는 아마도 미래의 관리자에게 가장 놀랍지 않은 교장을 위반할 가능성이 가장 적은 guid 일 것입니다 코드의.
PeterL

37

Guid.NewGuid() 충돌 가능성이 매우 낮도록 설계된 알고리즘을 사용하여 새 UUID를 만듭니다.

new Guid() 모두 0 인 UUID를 만듭니다.

일반적으로 UUID의 요점이므로 전자를 선호합니다 (물론 다른 곳에서받지 않는 한).

실제로 0이 아닌 UUID를 원하는 경우가 있지만이 경우 의도에 대해 더 명확 Guid.Empty하거나 default(Guid)분명한 사람이 있으며 고유 한 값이 생성 될 것으로 기대하는 사람이 읽을 가능성이 적습니다.

이처럼 new Guid()명확성이 부족하기 때문에 그다지 유용하지는 않지만 모든 0과 null 값을 반환하는 매개 변수가없는 생성자가없는 값 유형을 가질 수는 없습니다.

편집 : 실제로, 모든 것을 0과 null로 설정하지 않는 값 유형에 매개 변수가없는 생성자를 가질 수 있지만 C #에서는 할 수 없으며 호출 시점과 호출 시점에 대한 규칙 생성 된 모든 구조체가 혼란 스럽기 때문에 어쨌든 좋은 생각이 아닙니다.


16
재미있게 추가하겠습니다. 충돌 가능성 1 %를 달성하려면 약 2,600,000,000,000,000,000 GUID를 생성해야합니다.
클린턴 워드

8
@ClintonWard 사용중인 UUID 알고리즘에 따라 다르지만 일부는 MAC 주소를 사용하여 시스템 간의 충돌을 피하고 모두 동일한 시스템에서 충돌을 피하기 위해 시간 요소를 사용하므로 일반 수학보다 더 많이 생성해야합니다 제안합니다. 시간을 변경하고 MAC 주소를 엉망으로 알고리즘을 고의로 짓지 않는 한, 아주 빨리 얻을 수 있지만 입력을 고의로 엉망으로 만듭니다.
Jon Hanna

2
그것은 v1 Guid였습니다. 최신 MS GUID는 V4이며 GUID 생성의 일부로 MAC 주소를 사용하지 않습니다. 시간은 여전히 ​​요소입니다
클린턴 워드

16

[이것은 구식 스레드라는 것을 이해하고 좀 더 자세한 내용을 추가합니다.] Mark와 Jon Hanna의 두 가지 대답은 차이점을 요약합니다.

Guid.NewGuid()

결국 CoCreateGuid (Ole32에 대한 COM 호출) ( 여기서는 여기 참조)를 호출 하고 실제 작업은 UuidCreate에 의해 수행됩니다 .

Guid.Empty는 Guid에 모든 0이 포함되어 있는지 확인하는 데 사용됩니다. 이는 해당 Guid의 가치를 새로운 Guid () 와 비교하여 수행 할 수도 있습니다.

따라서 고유 식별자 가 필요한 경우 에는 Guid.NewGuid ()입니다.


-2

Guid.NewGuid()의도 한대로 GUID를 작성합니다.

Guid.NewGuid()Guid객체를 생성하고 호출 CoCreateGuid하여 객체를 초기화 하고 객체를 반환합니다.

new Guid() 그냥 빈 GUID를 만듭니다 (모두 0이라고 생각합니다).

나는 생성자를 그대로 공개해야한다고 생각 Guid합니다 struct.


5
몇 년 동안 여기에있는 답변에 아직 존재하지 않는 것을 추가하지 않는 답변을 추가하는 요점은 무엇입니까?
Dinerdo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.