Hashing associativo


14

Considera la lista debolmente collegata singolarmente in un ambiente puramente funzionale. Le sue lodi sono state cantate dalle cime delle montagne e continueranno a essere cantate. Qui affronterò uno tra i suoi numerosi punti di forza e la domanda su come estenderlo alla più ampia classe di sequenze puramente funzionali basate sugli alberi.

Il problema è il seguente: si desidera verificare l'uguaglianza strutturale quasi certa nel tempo O (1) mediante un forte hashing. Se la funzione hash è strutturalmente ricorsiva, ovvero hash (x: xs) = mix x (hash xs), è possibile memorizzare in modo trasparente i valori hash sugli elenchi e aggiornarli in O (1) quando un elemento viene inserito in un elenco esistente . La maggior parte degli algoritmi per gli elenchi di hashing sono strutturalmente ricorsivi, quindi questo approccio è eminentemente utilizzabile nella pratica.

Supponiamo, invece di elenchi collegati singolarmente, di avere sequenze basate su alberi che supportano la concatenazione di due sequenze di lunghezza O (n) nel tempo O (log n). Affinché la cache hash funzioni qui, la funzione di miscelazione hash deve essere associativa al fine di rispettare i gradi di libertà che un albero ha nel rappresentare la stessa sequenza lineare. Il mixer dovrebbe prendere i valori di hash dei sottotitoli e calcolare il valore di hash dell'intero albero.

Questo è dove ero sei mesi fa, quando ho trascorso una giornata rimuginando e facendo ricerche su questo problema. Sembra che non abbia ricevuto attenzione in letteratura sulle strutture di dati. Mi sono imbattuto nell'algoritmo di hash Tillich-Zemor dalla crittografia. Si basa sulla moltiplicazione della matrice 2x2 (che è associativa) in cui i bit 0 e 1 corrispondono ai due generatori di una subalgebra con voci in un campo di Galois.

La mia domanda è: cosa mi sono perso? Devono essere presenti documenti rilevanti sia nella letteratura sulla crittografia che nelle strutture di dati che non sono riuscito a trovare nella mia ricerca. Eventuali commenti su questo problema e possibili luoghi da esplorare sarebbero molto apprezzati.

Modifica: sono interessato a questa domanda sulle estremità morbide e crittograficamente forti dello spettro. Sul lato più morbido può essere utilizzato per le tabelle hash in cui le collisioni dovrebbero essere evitate ma non sono catastrofiche. Sul lato più forte può essere utilizzato per i test di uguaglianza.

Risposte:


2

Aggiunto : Dopo aver letto i commenti di Per, penso che questa risposta sia solo una (scarsa) variante dell'algoritmo di hash di Tillich-Zemor che è già menzionata nella domanda. Ritiro questa risposta, ma la lascio sperando che (e i commenti) possano essere informativi per alcuni lettori.


Modifica : una precedente revisione di questa risposta suggeriva di usare un'operazione monoid su [ m ], ma come sottolineato da Per in un commento, è preferibile usare un'operazione di gruppo.

Questa risposta riguarda la creazione di una funzione hash per le tabelle hash che è facile da implementare. Non è prevista una garanzia dimostrabile sulla qualità.

Supponendo che tu abbia già una funzione hash per ogni elemento di una sequenza in un set finito [ m ] = {1, ..., m }, che ne dite di interpretare ogni elemento di [ m ] come elemento in un gruppo finito G e usare il operazione di gruppo su G ? È possibile utilizzare qualsiasi mapping da [ m ] a G , ma è auspicabile che il mapping sia iniettivo in modo da non perdere le informazioni nel valore hash di ciascun elemento. È anche desiderabile che il gruppo non sia commutativo in modo che la funzione hash possa cogliere la differenza nell'ordine degli elementi in una sequenza.

Non so molto sui gruppi finiti che consentono operazioni veloci, ma immagino che tali gruppi siano noti nella teoria dei codici. L'uso del gruppo simmetrico di ordine almeno m potrebbe non essere così male.


1
Sì, anche l'hash di Tillich-Zemor usa la moltiplicazione di matrici. Quello che suggerisci non può funzionare senza ulteriori modifiche alla Tillich-Zemor. Ad esempio, è necessario evitare matrici singole o si ottiene l'accumulo a 0, rovinando le statistiche dell'hash. Tillich-Zemor lavora su un campo di Galois; una versione precedente del loro algoritmo presentava problemi perché utilizzavano un polinomio di generazione con statistiche non ottimali, quindi il particolare campo di Galois può essere molto importante.
Per Vognsen,

@Per: capisco. Grazie per la spiegazione. E che dire dell'utilizzo di gruppi finiti? Ho modificato la risposta a questo.
Tsuyoshi Ito,

Sono d'accordo. Il modo migliore per generare infinite famiglie di gruppi è con gruppi di matrici su campi finiti (cfr. Il teorema di classificazione per gruppi semplici finiti), quindi sembra che gli algoritmi di questa forma siano del tipo Tillich-Zemor.
Per Vognsen,

@Per: non ho familiarità con la teoria dei gruppi e non riesco a capire perché i gruppi di matrici su campi finiti siano migliori dei gruppi simmetrici in questo contesto. Puoi approfondire?
Tsuyoshi Ito,

1
Ci sono un paio di ragioni. Per uno, non è possibile calcolare in modo efficiente in grandi gruppi simmetrici e è necessario che i gruppi siano nell'ordine di 2 ^ 128 per la resistenza alle collisioni. Al contrario, è possibile calcolare le matrici su 2 campi finiti caratteristici in modo molto efficiente, specialmente se si sceglie un polinomio sparse del generatore; sono solo alcune manipolazioni.
Per Vognsen,

1

La famiglia quasi universale di funzioni hash

{ha(x)=aiximodp:aZp}

ha(x)+a|x|ha(y)=ha(xy)a|x|O(1)Zp

xyO(min(|x|,|y|)/p)


1

nn,ny,yny=H(y,y)HO(1)O(lgn)

H(x1,,xm)x1,,xmm

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.