Domanda

Sto cercando un PRNG (pseudo-casualità) che inizialmente seme con arbitraria di un array di byte.

Mai sentito di nessun?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top