2012-06-18 11 views
6

Mi piacerebbe sapere, considerando che Clojure usa l'hash a 32 bit per l'implementazione della mappa, se la mappa Clojure ha quindi un limite di 2^32-1 chiavi (e se questo non è vero, come gestisce le collisioni) e se la sua implementazione di hashing è consistent. TIA!Clojure map limits and consistency

+0

hai guardato il codice sorgente? – pmdj

+0

Sì, ma non riesco a capirlo appieno perché non sono uno sviluppatore Java: da quello che ho capito la funzione hash è hasheq che delega a Integer nel caso specifico che la chiave è un intero e al metodo hasheq Object chiave. Ma non riesco a capire (o tracciare di nuovo) la funzione di hash utilizzata, se la mappa supporta le collisioni e se la funzione di hash è coerente! –

+0

(Non capirò mai alcuni downvotes) –

risposta

10

mappe Clojure sono un'implementazione personalizzata che è persistente e immutabile (cioè fa non HashMaps uso Java, che non forniscono prestazioni sufficienti quando viene utilizzato in una struttura dati immutabile).

Utilizza codici hash a 32 bit, quindi 2^32 bucket hash possibili. In caso di collisioni, le chiavi e i valori vengono archiviati in una matrice per ciascun hash bucket, quindi è possibile che contenga più di 2^32 chiavi. Vedere lo PersistentHashMap source - in particolare la classe interna HashCollisionNode viene utilizzata per memorizzare un bucket di chiavi/valori rispetto a un singolo valore hashcode.

Poiché il numero di possibili bucket hash è corretto, l'hashing coerente è irrilevante: la chiave non deve mai essere rimappata.

Consulta anche:

+0

Grazie mille! –