Eu sei que há uma possibilidade minuciosa de um conflito, mas se eu gerasse um lote de 1000 GUIDs (por exemplo), seria seguro assumir que todos são únicos para salvar os testes de cada um?
Pergunta bônus
Uma maneira ideal de testar um GUID quanto à exclusividade? Filtro Bloom talvez?
Respostas:
Sim você pode. Como os GUIDs têm 128 bits de comprimento, existe uma possibilidade minúscula de um conflito - mas a palavra "minuto" não é nem de longe forte o suficiente. Existem tantos GUIDs que, se você gerar vários trilhões deles aleatoriamente, é mais provável que seja atingido por um meteorito do que ter uma colisão (da Wikipedia ). E se você não os estiver gerando aleatoriamente, mas estiver usando, por exemplo, o algoritmo de endereço MAC e carimbo de data e hora, eles também serão únicos, pois os endereços MAC são únicos entre os computadores e os carimbos de hora são exclusivos no seu computador . computador.
Editar 1: para responder à sua pergunta sobre bônus, a maneira ideal de testar um conjunto de GUIDs quanto à exclusividade é apenas assumir que todos eles são únicos. Por quê? Porque, dado o número de GUIDs que você está gerando, as chances de uma colisão com GUID são menores do que as chances de um raio cósmico inverter um pouco na memória do computador e estragar a resposta dada por qualquer algoritmo "preciso" que você gostaria para correr. (Veja esta resposta StackOverflow para a matemática.)
Há um número enorme de GUIDs por aí. Para citar o Guia do Mochileiro das Galáxias de Douglas Adams :
E como existem cerca de 7 × 10 22 estrelas no universo e pouco menos de 2 128 GUIDs, existem aproximadamente 4,86 × 10 15 - quase cinco quatrilhões - de GUIDs para cada estrela. Se cada uma dessas estrelas tivesse um mundo com uma população próspera como a nossa, então, ao redor de todas as estrelas, todos os humanos ou alienígenas que já viveram teriam direito a mais de 45 mil GUIDs. Para todas as pessoas na história, em todas as estrelas do universo. O espaço da GUID está no mesmo nível de abrangência que o tamanho de todo o universo. Você não precisa se preocupar.
( Edit 2: Refletindo sobre isto: wow eu não tinha percebido. Mim mesmo que isso significava O espaço GUID é incompreensivelmente maciça Eu sou uma espécie de no temor dele...)
fonte
10^14
células em seu corpo e 106,5 bilhões de pessoas já viveram. Ou,2.385 * 10^23
UUIDs para cada centavo na dívida pública dos EUA.Resposta curta: para fins práticos, sim.
No entanto, você deve considerar o paradoxo do aniversário!
Eu calculei algumas probabilidades de colisão representativas. Com UUIDs de 122 bits, conforme especificado no artigo da Wikipedia , a probabilidade de colisão é 1/2 se você gerar pelo menos
2.71492e18
UUIDs. Com 10 ^ 19 UUIDs, a probabilidade é 0,999918. Com 10 ^ 17 UUIDs, 0.000939953.Alguns números para comparação podem ser encontrados na Wikipedia. Assim, você pode atribuir com segurança um UUID para cada humano que viveu, cada galáxia no universo observável, cada peixe no oceano e cada formiga individual na Terra. No entanto , as colisões são quase certas se você gerar um UUID para cada transistor que a humanidade produz em um ano, cada inseto na Terra, cada grão de areia na Terra, cada estrela no universo observável ou qualquer coisa maior.
Se você gerar 1 bilhão de UUIDs por segundo, levaria cerca de 36 anos para obter uma probabilidade de colisão de 10%.
Eventualmente, provavelmente haverá uma colisão entre o conjunto de UUIDs gerados ao longo da história humana. Ainda assim, a probabilidade de que UUIDs colididos sejam usados para o mesmo objetivo é muito pequena, portanto não há problema na prática.
fonte
Uma análise da possibilidade de colisão está disponível na Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates
Conforme mencionado no link, isso será afetado pelas propriedades do gerador de números aleatórios.
Há também a possibilidade de um bug no código do gerador GUID; embora as chances sejam baixas, elas provavelmente são maiores do que as chances de uma colisão com base na matemática.
Um filtro Bloom pode ser apropriado; pode dizer rapidamente se um GUID é único, mas há uma chance de uma falsa indicação de uma colisão. Um método alternativo se você estiver testando um lote de cada vez é classificar o lote e comparar cada elemento sucessivo.
fonte
Em geral, sim, é seguro assumir.
Se o seu gerador de GUID for realmente aleatório, as possibilidades de um conflito em 1000 GUIDs são extraordinariamente pequenas.
Obviamente, isso pressupõe um bom gerador de GUID. Portanto, a questão é realmente quanto você confia na ferramenta que está usando para gerar GUID e ela tem seus próprios testes?
fonte
Embora uma colisão seja possível, é ALTAMENTE improvável. (Matemática aqui .) É seguro assumir que eles são de fato distintos.
fonte
Geralmente é uma suposição bastante segura.
http://en.wikipedia.org/wiki/Globally_Unique_Identifier
Um GUID é exclusivo 100% do tempo?
fonte