Pregunta

Busco un PRNG (pseudo aleatorio) que inicialmente las semillas con una serie arbitraria de bytes.

Heard de cualquier?

¿Fue útil?

Solución

Hashing su semilla longitud arbitraria (en lugar de utilizar XOR como paxdiablo sugirió) se asegurará de que las colisiones son extremadamente poco probable, es decir, igual a la probabilidad de una colisión de hash, con algo tal como SHA1 / 2 esto es una imposibilidad práctica.

A continuación, puede utilizar su semilla hash como la entrada a un PRNG decente como mi favorito, el Mersenne Twister.

Actualizar

La aplicación de Mersenne Twister disponible aquí ya parece aceptar una clave de longitud arbitraria: http://code.msdn.microsoft.com/MersenneTwister/Release/ProjectReleases.aspx?ReleaseId=529

ACTUALIZACIÓN 2

Para un análisis de qué tan poco probable una colisión SHA2 es ver cómo alguien duro tendría que trabajar para encontrar uno, citando http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-2 :

  

Hay dos ataques satisfacer-en-el-medio preimagen contra SHA-2 con un reducido número de rondas. Los primeros uno ataques 41 ronda SHA-256 de 64 rondas con complejidad de tiempo de 2 ^ 253.5 y complejidad espacio de 2 ^ 16, y 46-ronda SHA-512 de 80 rondas con el tiempo 2 ^ 511.5 y el espacio 2 ^ 3 . Los segundos ataques uno SHA-512 42-ronda SHA-256 con complejidad de tiempo de 2 ^ 251.7 y complejidad espacio de 2 ^ 12, y 42-ronda con el tiempo 2 ^ 502 y el espacio 2 ^ 22.

Otros consejos

¿Por qué no te XOR su secuencia arbitraria en un tipo de la longitud correcta (relleno con parte de sí mismo si es necesario)? Por ejemplo, si desea que la semilla "paxdiablo" y su PRNG tiene una semilla de cuatro bytes:

paxd    0x70617864
iabl    0x6961626c
opax    0x6f706178
        ----------
        0x76707b70 or 0x707b7076 (Intel-endian).

Yo sé que las miradas de semillas artificiales (y lo es ya que la clave es elegido entre alfa caracteres). Si realmente quería para que sea dispares donde es probable que la frase que venir de un rango similar, XOR de nuevo con un diferenciador como 0xdeadbeef o 0xa55a1248:

paxd    0x70617864    0x70617864
iabl    0x6961626c    0x6961626c
opax    0x6f706178    0x6f706178
        0xdeadbeef    0xa55a1248
        ----------    ----------
        0xa8ddc59f    0xd32a6938

I prefieren el segundo ya que se desplazan más fácilmente bytes similares en rangos diferentes (los bits superiores de los bytes en el diferenciador son dispares).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top