Pode ser aceitável assumir que números aleatórios serão únicos, mas você precisa ter cuidado.
Supondo que seus números aleatórios são igualmente distribuídos, a probabilidade de uma colisão é aproximadamente (n 2 / 2) / k onde n é o número de números aleatórios gerados e k é o número de possíveis valores que um número "aleatório" pode suportar.
Você não coloca um número em astronomicamente improvável, então vamos considerar 1 em 2 30 (aproximadamente em um bilhão). Vamos dizer ainda que você gera 2 30 pacotes (se cada pacote representa cerca de um kilobyte de dados, isso significa cerca de um terabyte de dados totais, grandes, mas não inimagináveis). Nós achamos que precisamos de um número aleatório com pelo menos 2 89 valores possíveis.
Primeiramente, seus números aleatórios precisam ser grandes o suficiente. Um número aleatório de 32 bits pode ter no máximo 2 32 valores possíveis. Para um servidor ocupado que não está nem perto o suficiente.
Em segundo lugar, seu gerador de números aleatórios precisa ter um estado interno suficientemente grande. Se o seu gerador de números aleatórios tiver apenas um estado interno de 32 bits, não importa quão grande seja o valor gerado a partir dele, você só obterá no máximo 2 32 valores possíveis.
Em terceiro lugar, se você precisar que os números aleatórios sejam únicos entre as conexões, e não apenas dentro de uma conexão, seu gerador de números aleatórios precisa ser bem propagado. Isto é especialmente verdadeiro se o seu programa for reiniciado com freqüência.
Em geral, os geradores de números aleatórios "regulares" nas linguagens de programação não são adequados para tal uso. Os geradores de números aleatórios fornecidos por bibliotecas de criptografia geralmente são.