¿Cuál es una manera eficiente de crear una gran cantidad de cadenas aleatorias pero únicas?

Comience con un mapeo trivial de enteros a cadenas (como el mapeo de base 26 0 ↦ aaaaaa , 1 ↦ aaaaab , …, 499999 ↦ abclqt ), luego use el cifrado de preservación de formato con alguna clave secreta constante para cifrar las cadenas (dependiendo de clave elegida, esto podría verse como aaaaaac1uy7o , aaaaaby1ikeh , …, abclqtn95ayi ). El resultado será indistinguible de aleatorio para cualquiera que no conozca la clave de cifrado, y la unicidad está garantizada porque existe una función de descifrado.

El cifrado de preservación de formato se distingue del cifrado regular en que una construcción inteligente permite que los espacios de entrada y salida tengan un tamaño arbitrario; no necesitan estar en correspondencia con las cadenas binarias [math] 2 ^ k [/ math] de algún tamaño de bloque [math] k [/ math] (por ejemplo, [math] k \ in \ {128, 192, 256 \} [ / matemáticas] para AES).

Hay construcciones probadamente seguras para el cifrado de preservación de formato basadas en un cifrado de bloque normal como AES. El estándar moderno se llama modo FFX de AES.
http://en.wikipedia.org/wiki/For…

Si puede vivir con números de 128 bits, intente encriptar AES en 1,2,3,4, … (usando una clave secreta). Siempre serán únicos (porque aes es un mapeo uno a uno), pero también aleatorios.

Use un generador congruencial lineal

http://en.wikipedia.org/wiki/Lin
http://en.wikipedia.org/wiki/Par

Elija y a, myc con un período mayor que la cantidad de cadenas que necesita.