Cercando PRNG che si può seminare con qualsiasi numero di byte
Domanda
Sto cercando un PRNG (pseudo-casualità) che inizialmente seme con arbitraria di un array di byte.
Mai sentito di nessun?
Soluzione
L'hash tuo seme lunghezza arbitraria (invece di usare XOR come paxdiablo suggerito) farà in modo che le collisioni sono estremamente improbabile, cioè uguale alla probabilità di una collisione hash, con qualcosa come SHA1 / 2 questa è un'impossibilità pratica.
È possibile quindi utilizzare il seme hash come input per un dignitoso PRNG come il mio preferito, il Mersenne Twister.
Aggiorna
L'implementazione Mersenne Twister disponibile qui sembra già di accettare una lunghezza arbitraria chiave: http://code.msdn.microsoft.com/MersenneTwister/Release/ProjectReleases.aspx?ReleaseId=529
UPDATE 2
Per un'analisi di quanto sia improbabile una collisione SHA2 è vedere quanto sia difficile che qualcuno avrebbe dovuto lavorare per trovare uno, citando http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-2 :
Ci sono due attacchi meet-in-the-middle preimage contro SHA-2 con un numero ridotto di giri. I primi si attacca 41-tutto SHA-256 su 64 giri con tempo complessità 2 ^ 253,5 complessità spaziale e di 2 ^ 16, e 46-tutto SHA-512 di 80 giri con tempo 2 ^ 511,5 e lo spazio 2 ^ 3 . Il secondo attacco 42 uno-tutto SHA-256 con tempo di complessità 2 ^ 251,7 complessità spaziale e di 2 ^ 12, e 42-tutto SHA-512 con tempo di 2 ^ 502 e lo spazio 2 ^ 22.
Altri suggerimenti
Perché non XOR arbitrari sequenza in un tipo di giusta lunghezza (imbottitura con una parte di se stesso, se necessario)?Per esempio, se si desidera che il seme "paxdiablo" e la tua PRNG quattro byte seme:
paxd 0x70617864
iabl 0x6961626c
opax 0x6f706178
----------
0x76707b70 or 0x707b7076 (Intel-endian).
So che il seme sembra artificiale (e si è visto che la chiave è scelto da caratteri alfabetici).Se si voleva davvero a rendere più disparate in cui la frase è probabile una simile gamma, XOR di nuovo con un elemento di differenziazione come 0xdeadbeef
o 0xa55a1248
:
paxd 0x70617864 0x70617864
iabl 0x6961626c 0x6961626c
opax 0x6f706178 0x6f706178
0xdeadbeef 0xa55a1248
---------- ----------
0xa8ddc59f 0xd32a6938
Io preferisco il secondo in quanto è più facile spostare simili byte in disparati campi (superiore bit del byte di differenziazione sono disparati).