Pode ser aceitável assumir que os números aleatórios serão únicos, mas você deve ter cuidado.
Supondo que seus números aleatórios sejam igualmente distribuídos, a probabilidade de uma colisão é aproximadamente (n 2/2 ) / k, em que n é o número de números aleatórios que você gera e k é o número de valores possíveis que um número "aleatório" pode assumir.
Você não coloca um número improvável em termos astronômicos, então vamos considerá-lo como 1 em 2 30 (aproximadamente 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, grande, mas não inimaginavelmente). Achamos que precisamos de um número aleatório com pelo menos 2 89 valores possíveis.
Em primeiro lugar, 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 chega nem perto do ponto alto.
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 o tamanho do valor que você gerar, você ainda obterá no máximo 2 32 valores possíveis.
Em terceiro lugar, se você precisar que os números aleatórios sejam únicos nas conexões, e não apenas dentro de uma conexão, seu gerador de números aleatórios precisará ser bem distribuído. Isto é especialmente verdade 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 esse uso. Os geradores de números aleatórios fornecidos pelas bibliotecas de criptografia geralmente são.