Um GUID é exclusivo 100% do tempo?

519

Um GUID é exclusivo 100% do tempo?

Ele permanecerá único em vários segmentos?

David Basarab
fonte
265
Não, não é 100% ... Apenas 99,999999999999999999999999999999999999999999999999999999999999999999999999999%;)
JohannesH
52
Antes de tudo, um GUID não é infinito, o que significa que, para o significado literal de "100% do tempo", significaria que, não importa quanto tempo você continue gerando GUIDs, eles sempre serão exclusivos. Este não é o caso. Além disso, desde a implementação original, onde o serial / id / MAC exclusivo da placa de rede foi usado para produzir uma parte da chave, não é mais usado, por vários motivos, um GUID não é mais único globalmente . É, no entanto, localmente único. Em outras palavras, se você continuar gerando GUIDs em uma única máquina, não receberá duplicatas.
Lasse V. Karlsen
36
@ojrac Acabei de escolher arredondar para baixo ...: P
JohannesH
403
Toda vez que eu gero GUID, sinto como se estivesse roubando um do Universo. Às vezes eu penso sobre más pessoas que geram muito mais GUIDs do que precisam e aqueles GUIDs desperdiçados são tão solitário não está sendo usado ou gerados de novo ...
asavartsov
29
@asavartsov Eu acho que você vai gostar wasteaguid.info ^ _ ^
Navin

Respostas:

431

Embora não seja garantido que cada GUID gerado seja exclusivo, o número total de chaves exclusivas (2 128 ou 3,4 × 10 38 ) é tão grande que a probabilidade de o mesmo número ser gerado duas vezes é muito pequena. Por exemplo, considere o universo observável, que contém cerca de 5 × 10 22 estrelas; toda estrela poderia ter 6,8 × 10 15 GUIDs universalmente únicos.

Da Wikipedia .


Estes são alguns bons artigos sobre como é feito um GUID (para .NET) e como você pode obter o mesmo guia na situação certa.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

O que outras pessoas estão dizendo

Adam Davis
fonte
115
Eles não seriam chamados de UUID, então? ;)
Arafangion
28
Um GUID é a implementação específica da Microsoft do padrão UUID. Então são os dois. ID globalmente único vs ID único universalmente.
811 Adam Davis
40
Tecnicamente, não é 2 ^ 128, porque em um GUID v4, você tem um dígito hexadecimal que sempre será um 4 (removendo efetivamente 4 bits), e dois bits adiante também são reservados. No entanto, 2 ^ 122 GUIDs V4 válidos ainda deixam cerca de 5x10 ^ 36, o que servirá para mim. e para você também. Cada estrela deverá aceitar apenas 1,1x10 ^ 14 GUIDs cada.
Andrew Shelansky
67
Se você é como eu, então você vai querer saber que 2^128escrito é de aproximadamente: 34,028,236,692,093,846,346,337,460,743,177,000,000. Estatisticamente, se você calculasse 1.000 GUIDs por segundo, ainda levaria trilhões de anos para obter uma duplicata.
Entidade
26
Eu apenas achei engraçado ler isso, então aqui, divirtam-se rapazes :) Trinta e quatro deciliões vinte e oito decilhões duzentos e trinta e seis nonilhões seiscentos e noventa e dois octilhões noventa e três septilhões oitocentos e quarenta e seis sextilhões trezentos e quarenta e seis quintilhões trezentos e trinta e sete quatrilhões quatrocentos e sessenta trilhões setecentos e quarenta e três bilhões cento e setenta e sete milhões
hjavaher
85

Se você tem medo dos mesmos valores GUID, coloque dois deles próximos um do outro.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Se você é muito paranóico, coloque três.

Bura Chuhadar
fonte
64
Você precisa ser muito, muito, muito, muito paranóico para anexar três GUIDs.
precisa saber é o seguinte
25
@harsimranb Não ... muito, muito, muito, muito paranóico são 6 GUIDs. Paranóico é um anexado, muito paranóico é dois anexados, etc #
Suamere
37
@Suamere Eu criei um site para calcular o seu nível paranóico jogge.github.io/HowParanoidAmI
Jogge
3
@Jogge xD Isso é incrível, lol. Depois das 9 e 9 do 999999999seu formulário, acho que a Paranoia vai explodir meu navegador.
Suamere 13/08/19
66

A resposta simples é sim.

Raymond Chen escreveu um ótimo artigo sobre GUIDs e por que substrings de GUIDs não têm garantia exclusiva. O artigo detalha a maneira como os GUIDs são gerados e os dados que eles usam para garantir a exclusividade, o que deve ser mais demorado para explicar por que eles são :-)

ljs
fonte
23
Acho que o artigo de Chen está se referindo à V1 do algoritmo de geração GUID, que usa um endereço MAC e um carimbo de data / hora - o V4 atual usa um número pseudo-aleatório: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett
2
o link está morto - 403 Proibido
daya
Aqui está o link: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
39

Como uma observação lateral, eu estava brincando com GUIDs de volume no Windows XP. Esse é um layout de partição muito obscuro, com três discos e quatorze volumes.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Não é que os GUIDs sejam muito semelhantes, mas o fato de todos os GUIDs terem a string "mario" neles. Isso é uma coincidência ou existe uma explicação por trás disso?

Agora, ao pesquisar na parte 4 do GUID, encontrei aproximadamente 125.000 ocorrências com GUIDs de volume.

Conclusão: Quando se trata de GUIDs de volume, eles não são tão exclusivos quanto outros GUIDs.

Jonas Gulle
fonte
31
Lembra-se do anúncio de Super Mario Bros 3 dos anos 80? Todas aquelas pessoas gritando "Mario! Mario! Mario!" em todo o mundo perturbou um pouco a aleatoriedade do universo.
MGOwen
24
Se você desinstalar manualmente o Office 2010 msiexec, ele listará todos os MSI GUIDs do programa office. Todos soletram 0FF1CE. Parece que a Microsoft tem um bastante ... solta ... interpretação de como gerar um GUID;)
Mark Henderson
3
Esses GUIDs de partição foram criados juntos em 17/12/2009 às 14:47:45 UTC. Eles são exclusivos da sua máquina, mas colocar "mario" como o identificador do nó está incorreto - significa que eles não são compatíveis com RFC-4122. Da mesma forma, os 0FF1CEGUIDs se enquadram na seção "Compatibilidade com versões anteriores do NCS" do RFC-4122, mas é improvável que a Microsoft esteja seguindo as regras do NCS para esses valores.
Stephen Cleary
16
Eu sabia, a Nintendo Security Administration comprometeu os geradores de números aleatórios.
MetaGuru
1
talvez seja esse mesmo parque de baile que o nome da empresa que produz água mineral (soube que eles lideram o mercado) Evian. Soletrado para trás dá Naive :-)
Mariusz
31

Isso não deveria acontecer. No entanto, quando o .NET está sob uma carga pesada, é possível obter guias duplicados. Eu tenho dois servidores web diferentes usando dois servidores sql diferentes. Fui mesclar os dados e descobri que tinha 15 milhões de guias e 7 duplicatas.

Tim
fonte
1
Como isso é possível em duas máquinas diferentes? Eu pensei que parte do GUID era o nome da máquina? (não argumentando ... apenas pedindo)
John Cruz
8
Isso seria verdadeiro apenas para os guias v1 que usam endereços MAC (não o nome da máquina) como parte da geração do GUID. O v4, que é de fato o STD, não usa mais endereços Mac, mas um número pseudo-aleatório.
Xander
14
Guid.NewGuidsempre gera GUIDs da v4 (e sempre gerou). Tim deve ter tido fontes de entropia extremamente ruins.
Stephen Cleary
1
Isso já foi replicado? esse é um problema enorme, se for o caso.
Zyo
1
O mesmo aqui ao importar conjuntos de dados muito grandes. De cerca de 10-100 milhões de você obter duplicatas de Guid.NewGuid
Stephan Baltzer
28

Sim, um GUID sempre deve ser exclusivo. É baseado em hardware e tempo, além de alguns bits extras para garantir que seja único. Tenho certeza de que é teoricamente possível terminar com dois idênticos, mas extremamente improvável em um cenário do mundo real.

Aqui está um ótimo artigo de Raymond Chen sobre Guids:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

Eric Z Beard
fonte
5
Este artigo é bastante antigo e refere-se à v1 dos GUIDs. A v4 não usa hardware / hora, mas um algoritmo de número aleatório. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham
O link está quebrado
Marcel
Aqui está o link: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
23

Guids são estatisticamente únicos. As chances de dois clientes diferentes gerarem o mesmo Guid são infinitamente pequenas (assumindo que não há bugs no código de geração do Guid). Você também pode se preocupar com falhas no processador devido a um raio cósmico e decidir que 2 + 2 = 5 hoje.

Vários segmentos que alocam novos guias obterão valores exclusivos, mas você deve considerar que a função que está chamando é segura para segmentos. Em que ambiente está?

Rob Walker
fonte
19

Eric Lippert escreveu uma série muito interessante de artigos sobre GUIDs.

Existem na ordem 2 30 computadores pessoais no mundo (e, é claro, muitos dispositivos portáteis ou dispositivos de computação que não são PCs que possuem mais ou menos os mesmos níveis de poder de computação, mas vamos ignorá-los). Vamos supor que colocamos todos esses PCs no mundo com a tarefa de gerar GUIDs; se cada um puder gerar, digamos, 2 20 GUIDs por segundo, depois de apenas cerca de 2 72 segundos - cento e cinquenta trilhões de anos - você terá uma chance muito alta de gerar uma colisão com seu GUID específico. E as chances de colisão ficam muito boas depois de apenas trinta trilhões de anos.

Paolo Moretti
fonte
28
... e ele continua no próximo parágrafo: "Mas isso está procurando uma colisão com um GUID específico. [...] Portanto, se colocarmos esses bilhões de PCs para trabalhar gerando GUIDs de 122 bits de aleatoriedade, a probabilidade de dois deles em algum lugar colidiriam muito alto após a geração de cerca de 2 ^ 61 GUIDs.Como assumimos que cerca de 2 ^ 30 máquinas estão executando 2 ^ 20 GUIDs por segundo, esperamos uma colisão após cerca de 2 ^ 11 segundos, ou seja, cerca de uma hora . " (E, finalmente, ele explica que, é claro, não que muitas GUIDs são gerados.)
Arjan
16

Teoricamente, não, eles não são únicos. É possível gerar um guia idêntico repetidamente. No entanto, as chances de isso acontecer são tão baixas que você pode assumir que elas são únicas.

Eu li antes que as chances são tão baixas que você realmente deve se estressar com outra coisa - como o servidor queimar espontaneamente ou outros bugs no seu código. Ou seja, suponha que seja único e não crie nenhum código para "capturar" duplicatas - gaste seu tempo com algo mais provável de acontecer (ou seja, qualquer outra coisa ).

Fiz uma tentativa de descrever a utilidade dos GUIDs para o público do meu blog (membros da família não técnicos). A partir daí (via Wikipedia), as chances de gerar um GUID duplicado:

  • 1 em 2 ^ 128
  • 1 em 340 undecilhões (não se preocupe, undecilhões não estão no quiz)
  • 1 em 3,4 × 10 ^ 38
  • 1 em 340.000.000.000.000.000.000.000.000.000.000.000.000.000
Michael Haren
fonte
1
Na verdade, eu discordo de 'não me preocupar com isso', embora de uma posição diferente: se você detectar uma colisão de GUID, algo deu errado com seu aplicativo. Eu usei GUIDs, por exemplo, para idempotência, e tenho uma colisão quando um comando é enviado duas vezes (com o mesmo GUID).
Kenny Hung
9

Nada parece mencionar a matemática real da probabilidade de isso ocorrer.

Primeiro, vamos supor que podemos usar todo o espaço de 128 bits (o Guid v4 usa apenas 122 bits).

Sabemos que a probabilidade geral de NÃO obter uma duplicata nas nescolhas é:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )

Como 2 128 é muito maior do que n, podemos aproximar isso de:

(1-1 / 2 128 ) n (n-1) / 2

E como podemos assumir que né muito maior que 0, podemos aproximar isso a:

(1-1 / 2 128 ) n ^ 2/2

Agora podemos equiparar isso à probabilidade "aceitável", digamos 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Que resolvemos ne obtemos:

n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))

Qual Wolfram Alpha é 5.598318 × 10 19

Para colocar esse número em perspectiva, vamos pegar 10000 máquinas, cada uma com uma CPU de 4 núcleos, fazendo 4Ghz e gastando 10000 ciclos para gerar um Guid e nada mais. Levaria aproximadamente 111 anos antes que eles gerassem uma duplicata.

Cine
fonte
Editei sua postagem após esta postagem - edite se eu cometer um erro;).
shA.t
Olá @Cine, tenho o poder de editar sua resposta, mas optou por não, porque quero ter a chance de refutá-la primeiro. Provavelmente, chegarei em um mês para alterá-la formalmente se não Não tenho notícias suas. Estou bastante certo de que sua matemática está errada. a equação real para determinar uma chance de 1% é a seguinte: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = 0,01. Seu expoente está errado. não é apenas n. Você precisa de C (n, 2) (aka (n * (n-1)) / 2) para calcular todas as combinações quando gerar "n" guias. Veja aqui para mais informações
viggity
Obrigado Cine, eu também acabei aproximando n ^
2/2
Levaria 10000 máquinas 111 anos para gerar cada GUID possível e, em seguida, gerar uma duplicata. Uma duplicata, no entanto, ocorreria muito antes que todos os GUIDs possíveis fossem gerados. Penso que o prazo aproximado depende de quão aleatório é o processo de geração de GUID.
George K
@ GeorgeK Acho que você não entendeu ... Levaria 10000 máquinas 111 anos para ter 1% de chance de encontrar uma duplicata. Mas sim, esse curso de matemática assume que o gerador aleatório é totalmente aleatório.
Cine
7

De http://www.guidgenerator.com/online-guid-generator.aspx

O que é um GUID?

GUID (ou UUID) é um acrônimo para 'Globally Unique Identifier' (ou 'Universally Unique Identifier'). É um número inteiro de 128 bits usado para identificar recursos. O termo GUID é geralmente usado por desenvolvedores que trabalham com tecnologias da Microsoft, enquanto o UUID é usado em qualquer outro lugar.

Quão único é um GUID?

128 bits é grande o suficiente e o algoritmo de geração é único o suficiente para que se 1.000.000.000 de GUIDs por segundo fossem gerados por 1 ano, a probabilidade de uma duplicata seria de apenas 50%. Ou se todo ser humano na Terra gerasse 600.000.000 de GUIDs, haveria apenas 50% de probabilidade de duplicação.

Tono Nam
fonte
7
não há 50% de chance de duplicar alta o suficiente para causar medo?
disklosr
1
@disklosr sim, é suficiente causar medo se seus sistemas estiverem gerando 1 bilhão de GUIDs por segundo. No caso extremamente improvável que você está gerando essa quantidade em seguida, basta encadear dois GUIDs juntos ...
maxshuty
5

Eu experimentei um GUID duplicado.

Eu uso o scanner de mesa Neat Receipts e ele vem com um software de banco de dados proprietário. O software possui um recurso de sincronização com a nuvem e eu continuava recebendo um erro ao sincronizar. Um olhar atento aos troncos revelou a linha impressionante:

"erros": [{"código": 1, "mensagem": "creator_guid: já foi utilizado", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Fiquei um pouco descrente, mas com certeza, quando encontrei uma maneira de entrar no meu banco de dados local do neatworks e excluí o registro que continha esse GUID, o erro parou de ocorrer.

Então, para responder sua pergunta com evidência anedótica, não. É possível duplicar. Mas é provável que a razão pela qual isso aconteceu não tenha sido por acaso, mas devido à prática padrão de não ser respeitada de alguma maneira. (Eu não tenho tanta sorte) No entanto, não posso dizer com certeza. Não é o meu software.

O suporte ao cliente foi EXTREMAMENTE cortês e prestativo, mas eles nunca devem ter encontrado esse problema antes porque, após mais de 3 horas no telefone com eles, não encontraram a solução. (FWIW, estou muito impressionado com o Neat, e essa falha, por mais frustrante que seja, não mudou minha opinião sobre o produto deles.)

exintrovertido
fonte
19
Não acredite que você tenha uma duplicata. Provavelmente havia algo mais envolvido, como o número não era verdadeiramente aleatório ou problema no processo de sincronização ou o sistema tentou gravar duas vezes etc. Um problema de software é muito mais provável do que a obtenção de um GUID duplicado.
orad 19/09/2013
4

MSDN :

Há uma probabilidade muito baixa de que o valor do novo Guid seja zero ou igual a qualquer outro Guid.

Jakub Šturc
fonte
4

Se o relógio do sistema estiver ajustado corretamente e não tiver sido concluído, e se a sua NIC tiver seu próprio MAC (ou seja, você não tiver definido um MAC personalizado) e o seu fornecedor da NIC não estiver reciclando os MACs (o que eles não deveriam fazer mas sabe-se que isso ocorre) e, se a função de geração de GUID do seu sistema for implementada adequadamente, ele nunca gerará GUIDs duplicados.

Se todos os que estão gerando GUIDs seguirem essas regras, seus GUIDs serão globalmente exclusivos.

Na prática, o número de pessoas que violam as regras é baixo e é improvável que seus GUIDs "escapem". Conflitos são estatisticamente improváveis.

DrPizza
fonte
11
Isso seria verdade apenas para os guias da v1. O v4, que é de fato o STD, não usa mais endereços Mac, mas um número pseudo-aleatório.
precisa
1
"seu sistema nunca irá gerar GUIDs duplicados" Mesmo que todas as regras tenham sido seguidas para um guid v1, como você diz, seu sistema ainda poderá gerar duplicatas. Você está mais correto na parte inferior quando declara "Conflitos são estatisticamente improváveis".
Nick Meldrum
3

Um GUID é exclusivo 100% do tempo?

Não garantido, pois existem várias maneiras de gerar uma. No entanto, você pode tentar calcular a chance de criar dois GUIDs idênticos e ter a ideia: um GUID possui 128 bits; portanto, existem 2 128 GUIDs distintos - muito mais do que estrelas no universo conhecido. Leia o artigo da Wikipedia para mais detalhes.

Konrad Rudolph
fonte
2

Em um sentido mais geral, isso é conhecido como "problema do aniversário" ou "paradoxo do aniversário". A Wikipedia tem uma boa visão geral em: Wikipedia - Problema de Aniversário

Em termos muito aproximados, a raiz quadrada do tamanho da piscina é uma aproximação aproximada de quando você pode esperar uma chance de 50% de duplicação. O artigo inclui uma tabela de probabilidades do tamanho do pool e várias probabilidades, incluindo uma linha para 2 ^ 128. Portanto, para uma probabilidade de 1% de colisão, você esperaria escolher aleatoriamente 2,6 * 10 ^ 18 números de 128 bits. Uma chance de 50% requer 2,2 * 10 ^ 19 picaretas, enquanto SQRT (2 ^ 128) é 1,8 * 10 ^ 19.

Obviamente, esse é apenas o caso ideal de um processo verdadeiramente aleatório. Como outros mencionaram, muita coisa depende desse aspecto aleatório - quão bom é o gerador e a semente? Seria bom se houvesse algum suporte de hardware para ajudar nesse processo que seria mais à prova de balas, exceto que qualquer coisa pode ser falsificada ou virtualizada. Suspeito que essa seja a razão pela qual os endereços MAC / carimbos de hora não são mais incorporados.

mszil
fonte
Eu acho que o problema do MAC era o anonimato. Acredito que o uso de um identificador como um endereço MAC de uma maneira que possa ser revertida era uma preocupação de privacidade. Eu acredito que aleatório verdadeiro em hardware é muito difícil? Cloudflare usa uma câmera e uma fileira de lâmpadas de lava, porém acho que com uma compreensão precisa da física, mesmo isso não é aleatório? Lâmpada de lava Cloudflares RNG: popularmechanics.com/technology/security/news/a28921/…
Jeff Block
2

Para obter melhores resultados, a melhor maneira é anexar o GUID com o carimbo de data / hora (apenas para garantir que ele permaneça único)

Guid.NewGuid().ToString() + DateTime.Now.ToString();
Adithya Sai
fonte
E se você tiver duas colisões no mesmo segundo?
Wai Ha Lee
Esse é o pior caso, mas ainda assim, não podemos ter os mesmos dois Guid gerados ao mesmo tempo.
Adithya Sai
Em algum lugar eles argumentam, que se deve copiar a resposta em SO, não a pergunta, mas eu não estou tão certo agora ....
Marcel
Que tal Guid.NewGuid (). ToString (). Replace ("-", "") + DateTime.Now.Ticks .... Não é questionável sobre a exclusividade e pode ser usado como chave primária
codificador-d
1

Os algoritmos GUID são geralmente implementados de acordo com a especificação v4 GUID, que é essencialmente uma sequência pseudo-aleatória. Infelizmente, eles se enquadram na categoria de "provavelmente não exclusivo" , da Wikipedia (não sei por que tantas pessoas ignoram esse bit): "... outras versões do GUID têm propriedades e probabilidades de exclusividade diferentes, variando de exclusividade garantida provavelmente não exclusividade ".

As propriedades pseudo-aleatórias do JavaScript do V8 Math.random()são TERRÍVEIS com exclusividade, com colisões ocorrendo após apenas alguns milhares de iterações, mas o V8 não é o único culpado. Eu já vi colisões GUID do mundo real usando implementações PHP e Ruby de v4 GUIDs.

Como está se tornando cada vez mais comum escalar a geração de ID entre vários clientes e clusters de servidores, a entropia é um grande sucesso - as chances de a mesma semente aleatória ser usada para gerar uma escalada de ID (o tempo geralmente é usado como uma semente aleatória em geradores pseudo-aleatórios) e as colisões de GUID aumentam de "provavelmente não exclusivo" para "muito provável que causem muitos problemas".

Para resolver esse problema, propus-me criar um algoritmo de ID que pudesse ser dimensionado com segurança e dar melhores garantias contra colisões. Faz isso usando o registro de data e hora, um contador de cliente na memória, impressão digital do cliente e caracteres aleatórios. A combinação de fatores cria uma complexidade aditiva que é particularmente resistente à colisão, mesmo se você a dimensionar em vários hosts:

http://usecuid.org/

Eric Elliott
fonte
1

Eu experimentei que os GUIDs não eram exclusivos durante o teste de unidade com vários processos / processos múltiplos (também?). Eu acho que isso tem a ver com, todas as outras coisas sendo iguais, a semeadura idêntica (ou falta de semeadura) de geradores pseudo-aleatórios. Eu estava usando-o para gerar nomes de arquivos exclusivos. Eu achei o sistema operacional muito melhor nisso :)

Alerta de pesca à linha

Você pergunta se os GUIDs são 100% exclusivos. Isso depende do número de GUIDs nos quais deve ser exclusivo. À medida que o número de GUIDs se aproxima do infinito, a probabilidade de GUIDs duplicados se aproxima de 100%.

Robert Jørgensgaard Engdahl
fonte
1

A resposta de "Um GUID é 100% exclusivo?" é simplesmente "não" .

  • Se você deseja 100% de exclusividade do GUID, faça o seguinte.

    1. gerar GUID
    2. verifique se esse GUID existe em sua coluna da tabela em que você está procurando exclusividade
    3. se existir, vá para a etapa 1 e a etapa 4
    4. use esse GUID como exclusivo.
Baba Khedkar
fonte
Isso não o torna único. Seu algoritmo não salva o GUID recém-criado na tabela. Na próxima vez que você criar um GUID, ele poderá colidir com um antes. Se você inserir o GUID na tabela, o GUID já poderá ter sido inserido por outro par entre você verificou a exclusividade e você inseriu o GUID na tabela. O GUID é exclusivo apenas no SEU sistema; portanto, se você importar ou mesclar dois bancos de dados, eles ainda poderão colidir. Além disso, o GUID geralmente é usado quando você não tem acesso a um banco de dados centrilizado. Se você tivesse, por que não apenas puxar um ID do banco de dados?
Jogge
0

A parte mais difícil não é gerar um Guid duplicado.

A parte mais difícil é projetar um banco de dados para armazenar todos os gerados e verificar se ele é realmente duplicado.

Partida WIKI:

Por exemplo, o número de UUIDs da versão aleatória 4 que precisam ser gerados para ter uma probabilidade de 50% de pelo menos uma colisão é de 2,71 quintilhões, calculado da seguinte forma:

insira a descrição da imagem aqui

Esse número equivale a gerar 1 bilhão de UUIDs por segundo por cerca de 85 anos, e um arquivo contendo muitos UUIDs, com 16 bytes por UUID, seria cerca de 45 exabytes, muitas vezes maior que os maiores bancos de dados existentes atualmente, que estão em a ordem de centenas de petabytes

Trong Hiep Le
fonte
0

GUID significa Identificador Único Global

Em resumo: (a pista está no nome)

Em detalhes: os GUIDs são projetados para serem únicos; eles são calculados usando um método aleatório baseado no relógio do computador e no próprio computador; se você estiver criando muitos GUIDs no mesmo milissegundo na mesma máquina, é possível que eles correspondam, mas para quase todas as operações normais eles devem ser considerados únicos.

Benjamin Roberts
fonte