Guid.NewGuid () vs. new Guid ()

346

Qual é a diferença entre Guid.NewGuid()e new Guid()?

Qual é o preferido?

OscarRyz
fonte
6
@ClintonWard Sou praticamente novo em C # e @ Bob2Chiv Não posso executar o projeto agora e estava curioso sobre isso.
OscarRyz 13/08/12
6
@OscarRyz - Para testar rapidamente o código em C #, eu uso o LinqPad .
DaveShaw
5
Na verdade, acredito que essa pergunta é relevante, porque é confusa e eu realmente não "0000000-0000 .." como o melhor padrão. Eu só tive um problema onde um cliente não pode acessar um sistema, porque em algum lugar dentro do projeto novo Guid () foi chamado em vez de NewGuid ()
Michiel Cornille
3
@DaveShaw - O LinQPad é ótimo e eu uso muito. Mas eu queria ressaltar que o Visual Studio agora tem uma janela "C # Interactive" que é muito útil para esses tipos de testes.
Mark Meuer
11
@MichielCornille só tenho que saber o sentimento bro ...
Jins Peter

Respostas:

580

new Guid() cria um guid all-0 "vazio" (00000000-0000-0000-0000-000000000000 não é muito útil).

Guid.NewGuid() cria um guia real com um valor único, o que você provavelmente deseja.

MarkPflug
fonte
26
Um UUID vazio é realmente muito útil. Faz um grande valor especial.
Jon Hanna
103
Em uma nota lateral, new Guid()é equivalente a Guid.Empty.
23812 Steve Guidi
30
@ JonHanna Todos os guias produzem grandes valores especiais. Infelizmente, os vazios tendem a colidir. Concordo que os guias vazios são úteis, normalmente, para indicar que algo não foi inicializado.
MarkPflug
5
Os vazios são muito úteis porque colidem. Um valor especial que não colidisse com o valor especial conhecido seria inútil.
Jon Hanna
5
Acho que vocês dois concordam que é um bom "guia conhecido" para comparar, como no caso de indicar que algo está aguardando inicialização ou está em algum outro estado conhecido. Pessoalmente, eu preferiria usar um valor nulo, mas percebo que alguém pode precisar de uma guia "especial" em algum momento, e a guia all-0 é provavelmente a menos provável que viole o principal de menor surpresa para futuros mantenedores do código.
Peterl
37

Guid.NewGuid() cria um novo UUID usando um algoritmo projetado para tornar as colisões muito, muito improváveis.

new Guid() cria um UUID que é todo-zeros.

Geralmente você prefere o primeiro, porque esse é o objetivo de um UUID (a menos que você esteja recebendo de outro lugar, é claro).

Há casos em que você realmente deseja um UUID zero, mas nesse caso Guid.Emptyou default(Guid)é mais claro sobre sua intenção, e há menos chances de alguém lê-lo esperando que um valor exclusivo tenha sido criado.

No geral, new Guid()isso não é útil devido a essa falta de clareza, mas não é possível ter um tipo de valor que não tenha um construtor sem parâmetros que retorne um valor com todos os zeros e nulos.

Edit: Na verdade, é possível ter um construtor sem parâmetros em um tipo de valor que não defina tudo como zero e nulo, mas você não pode fazê-lo em C #, e as regras sobre quando será chamado e quando haverá apenas ser uma estrutura totalmente zero criada é confusa, portanto não é uma boa ideia.

Jon Hanna
fonte
16
Vou adicionar isso por diversão. Para 1% de chance de colisão, que você precisa para gerar cerca de 2,600,000,000,000,000,000 GUIDs
Clinton Ward
8
@ClintonWard depende de qual algoritmo UUID está em uso, mas como alguns usam endereços MAC para evitar colisões entre máquinas e todos usam um fator de tempo para evitar colisões na mesma máquina, é necessário criar ainda mais do que a matemática normal sugeriria. A menos que você estrague deliberadamente o algoritmo, alterando a hora e mexendo nos endereços MAC, nesse caso, você deve obter um rapidamente - mas isso está mexendo deliberadamente nas entradas.
9137 Jon Hanna
2
Essa foi a v1 Guid. Os MS GUIDs mais recentes da Microsoft são V4 e não usam o endereço MAC como parte da geração do GUID. O tempo ainda é um fator embora
Clinton Ward
16

[Entendo que este é um tópico antigo, apenas adicionando mais alguns detalhes] As duas respostas de Mark e Jon Hanna resumem as diferenças, embora possa interessar a alguns que

Guid.NewGuid()

Eventualmente chama CoCreateGuid (uma chamada COM para Ole32) (referência aqui ) e o trabalho real é feito por UuidCreate .

Guid.Empty deve ser usado para verificar se um Guid contém todos os zeros. Isso também pode ser feito através da comparação do valor do Guid em questão com o novo Guid ()

Portanto, se você precisar de um identificador exclusivo , a resposta é Guid.NewGuid ()

Sudhanshu Mishra
fonte
-2

Guid.NewGuid(), pois cria GUIDs conforme o planejado.

Guid.NewGuid()cria um Guidobjeto vazio , inicializa-o chamando CoCreateGuide retorna o objeto.

new Guid() apenas cria um GUID vazio (todos os zeros, eu acho).

Eu acho que eles tiveram que tornar o construtor público como Guidé um struct.

Sharath
fonte
5
Qual é o sentido de adicionar uma resposta que não adicione nada que ainda não exista nas respostas que estão aqui há anos?
Dinerdo