Um GUID é exclusivo 100% do tempo?
Ele permanecerá único em vários segmentos?
Um GUID é exclusivo 100% do tempo?
Ele permanecerá único em vários segmentos?
Respostas:
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
2^128
escrito é 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.
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.
999999999
seu formulário, acho que a Paranoia vai explodir meu navegador.
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 :-)
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.
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;)
0FF1CE
GUIDs 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.
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.
Guid.NewGuid
sempre gera GUIDs da v4 (e sempre gerou). Tim deve ter tido fontes de entropia extremamente ruins.
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
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á?
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.
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:
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 n
escolhas é:
(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 n
e 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.
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.
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.)
MSDN :
Há uma probabilidade muito baixa de que o valor do novo Guid seja zero ou igual a qualquer outro Guid.
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.
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.
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.
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();
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:
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 :)
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%.
A resposta de "Um GUID é 100% exclusivo?" é simplesmente "não" .
Se você deseja 100% de exclusividade do GUID, faça o seguinte.
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
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.