Funzione hash casuale senza collisioni

1

Correlato alla domanda Which l'algoritmo di hashing è il migliore per unicità e velocità?

C'è un modo per creare una funzione hash, o trovarne una, la cui lunghezza hash dipende completamente dalla lunghezza dell'input, ha un set di caratteri hash regolabili (Dal momento che deve essere una funzione 1-a-1, l'input deve essere conforme a questo anche il vincolo del set di caratteri).

Inoltre, la parte più importante è che la funzione di hash genera come random le stringhe possibili. Quindi, ad esempio, sarebbe possibile ottenere i seguenti due risultati diversi.

Hash(aaaa)->blue // for character set a-z

e

Hash(aaaz)->pink  // for character set a-z

Altri esempi:

Hash(aa@12a)->dakj@4   // for character set a-z, @, 0-9

e

Hash(a2#46Ww)->@3#0Pdw // for character set a-z A-Z, !-), 0-9

Avviso la lunghezza del carattere tra input e output e i set di caratteri.

Ciò che ho pensato finora era una funzione di distribuzione di probabilità, ci sono funzioni di distribuzione casuale ma non sono sicuro di come arrivarci.

link

link

    
posta makakas 26.04.2014 - 20:15
fonte

3 risposte

4

Questa non è una funzione hash. È una funzione di codifica o di crittografia.

Di solito quando ho riscontrato un problema con questo modulo, è perché ho una sorta di ID che voglio "sembrare" casuale. Supponendo che non mi interessi per la sicurezza, normalmente creerò un algoritmo che funziona come segue:

  1. Mappa i miei dati in numeri (di solito trattando una stringa in un set di caratteri contenente caratteri X come numero baseX).
  2. Mappa i miei numeri a nuovi numeri. Eric Lippert suggerisce di utilizzare Multiplicative Inverses per questo scopo. La codifica Skip32 (la crittografia AKA di Skip32, ma è non sicura) funziona anche a questo scopo.
  3. Invertire la mappatura nel passaggio 1.

Per decodificare, esegui gli stessi passaggi al contrario.

    
risposta data 26.04.2014 - 20:55
fonte
1

Utilizzerei una funzione di hash perfetta per mappare il tuo set di n input a un numero intero univoco < n, quindi usalo come indice in una matrice di output (ad esempio un elenco di n colori) o mappalo su una stringa univoca nel tuo set di caratteri (ad esempio converti il numero in base 26 e render ogni cifra in base-26 come quella lettera dell'alfabeto).

    
risposta data 26.04.2014 - 23:54
fonte
0

Mi sembra che Format Preserving Encryption sia esattamente quello che stai cercando, tranne forse le proprietà di sicurezza implicite dalla "crittografia". La pagina di Wikipedia rileva che

For such finite domains, and for the purposes of the discussion below, the cipher is equivalent to a permutation of N integers {0, ... , N−1} where N is the size of the domain.

Per il tuo caso, le parole di 4 lettere con x possibilità per ogni carattere sarebbero codificate come numeri interi trattandole come numeri base-x. Quindi la permutazione avrebbe mappato quell'input in un output distinto, che sarebbe stato decodificato in una stringa invertendo la trasformata base-x.

Sembra che il modo migliore per implementare tale permutazione sia applicare una permutazione di M-bit al valore di input, e se il risultato è N o più per applicarlo nuovamente al risultato fino a che il risultato è minore di N, chiamato anche ciclo walking. Funziona meglio quando N è leggermente inferiore a 2 ^ M.

Ci sono modi per utilizzare Feistel Networks per adattare crittografie di ampie dimensioni per produrre permutazioni di larghezza di bit arbitrarie, ma ciò richiede che iterazione della rete produca una buona permutazione.

    
risposta data 07.06.2018 - 10:15
fonte

Leggi altre domande sui tag