Guardate Fisher-Yates shuffle di un modo per permutare la stringa in base a una chiave. Inserisci la chiave come seme in un PRNG, usala per generare i numeri casuali usati dallo shuffle.
Ora, come invertire la procedura? Fisher-Yates funziona scambiando determinate coppie di elementi. Quindi, per invertire il processo, è possibile alimentare la stessa chiave nello stesso PRNG, quindi eseguire l'algoritmo di Fisher-Yates come se fosse che si mischiasse un array della dimensione della stringa. Ma in realtà non si sposta nulla, basta registrare gli indici degli elementi che verrebbero scambiati in ogni fase.
Dopo aver eseguito questa operazione, scorrere l'elenco degli swap in senso inverso, applicandoli alla stringa mischiata. Il risultato è la stringa originale.
Quindi, per esempio, supponiamo di aver mischiato la stringa "ciao" usando i seguenti swap (non ho usato un PRNG qui, ho tirato i dadi, ma il punto su un PRNG è che ti dà la stessa sequenza di numeri dati lo stesso seme):
(4,0): "hello" -> "oellh"
(3,3): "oellh" -> "oellh"
(2,1): "oellh" -> "olelh"
(1,0): "olelh" -> "loelh"
Quindi, la stringa mescolata è "loelh".
Per deshuffle, genero la stessa serie di numeri "casuali", 0, 3, 1, 0, quindi applicare lo swap in ordine inverso:
(1,0): "loelh" -> "olelh"
(2,1): "olelh" -> "oellh"
(3,3): "oellh" -> "oellh"
(4,0): "oellh" -> "hello"
successo!
Lo svantaggio di questo, naturalmente, è che utilizza molta memoria per il disarmo: una serie di indici purché la vostra matrice di caratteri originale. Quindi per array veramente enormi, potresti voler scegliere un PRNG (o comunque una funzione di generazione della sequenza) che può essere scalato avanti o indietro senza dover memorizzare tutta l'uscita. Questo esclude i PRNG crittograficamente sicuri basati su hash, ma gli LFSR sono reversibili.
A proposito, perché vuoi farlo?
Cosa si intende per "shuffle"? È "dlrow olleH" shuffle? O intendi crittografia? –
Un testo casuale che mescola in modo casuale con la formula e una chiave/password, e può essere invertito quando usiamo la stessa chiave. – Tush
Vuoi dire che i personaggi devono essere uguali a quelli dell'originale, ma mescolati (ad esempio "ciao mondo" -> "ehwl llodor") o crittografati (ad esempio "ciao mondo" -> "%[email protected]+ = | ")? – digEmAll