Volta e meia é necessário garantir a unicidade de uma informação.
Tática Ingênua
dado = "dado invariante qualquer"
numero = random()
unicidade = dado + numeroEsta tática é ingênua pois possui alta possibilidade de repetição.
Como assim "alta possibilidade de repetição"?!!? Você está dizendo que o gerador de números aleatórios da minha linguagem preferida não é bom!?!?
De forma alguma. Porém imagine que este código permanecerá executando por bastante tempo: segundos, minutos, horas, dias, semanas, meses, anos. Alguma hora vai haver uma repetição.
Tática Menos Ingênua
dado = "dado invariante qualquer"
agora = ctime()
numero = random()
unicidade = dado + agora + numeroEsta tática é 'menos' ingênua pois ela possui uma possibilidade bastante baixa de repetição.
Atente somente ao fato de que
pouca probabilidade não significa
impossibilidade. Ainda é possível que haja repetição, porém o parâmetro aleatório (variável
número no exemplo) serve para desempatar dois resultados que ocorram simultaneamente.
Simultaneamente? Sim! Este código pode ser executado em computadores diferentes, que nem possuem comunicação entre si e mesmo assim possuem baixa possibilidade de gerar o mesmo número em dois ou mais eventos.
Se a variavel
agora possuir o valor '20060415020030111' que significa '15/Abr/2006 02:00:30.111' (15 de Abril de 2006 às 2h da manhã mais 30 segundos e 111 milésimos de segundo), a variável
numero seria utilizada como 'fator de desempate' entre dados gerados no mesmo milissegundo em threads ou computadores diferentes.
Como mencionado anteriormente, uma grande vantagem deste método é a descentralização das informações. Vários eventos podem ocorrer em qualquer lugar e nenhuma comunicação é necessária entre eles para garantir uma unicidade bastante razoável.
Se utilizarmos algum identificador único do computador, como seu IP ou mesmo seu nome, garantimos que a variável
numero só será necessária para desempatar dados gerados no mesmo computador, pois nenhum outro computador gerará o mesmo dado, a não ser que possua o mesmo IP ou nome do computador em questão.