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
risposta
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:
- http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey (presentazione che spiega l'approccio Clojure alla concorrenza, ma copre anche le persistenti strutture di dati immutabili)
Grazie mille! –
- 1. Clojure apply vs map
- 2. JavaScript setInterval Limits?
- 3. localStorage Size Limits ... Quali sono le opzioni?
- 4. Qual è la differenza tra hash-map e array-map in clojure?
- 5. Come si usa Sort-map-by in Clojure?
- 6. Clojure map key con spazi nel nome della chiave
- 7. Uso di 'map' con raccolte di dimensioni diverse nel clojure
- 8. "applica vector map map" idioma - Come sono le 2 funzioni?
- 9. "Eventuale coerenza" rispetto a "Strong Event Coerance" vs "Strong Consistency"?
- 10. Un database può supportare "Atomicity" ma non "Consistency" o viceversa?
- 11. java.util.concurrent.Delayed mi costringe davvero a violare equals/compare To consistency?
- 12. I trasduttori Clojure sono desiderosi?
- 13. Drools and Maps
- 14. header and footer and freemarker
- 15. Compass Sprite Image and Scale
- 16. Clojure non cattura NumberFormatException
- 17. Navigation Drawer and MapFragment
- 18. Implementazione Clojure condizionale/branching trasduttore
- 19. Google Map v3 Map caricato evento
- 20. gulp: uglify and sourcemaps
- 21. Rails association and forms
- 22. Clojure Editor scritto in Clojure
- 23. = e == in Clojure
- 24. jQuery selector con "and" and "or"
- 25. HTML5 Drag and Drop effectAllowed and dropEffect
- 26. aggiornamento simultaneo java map
- 27. Ambito dinamico in Clojure?
- 28. Informazioni sull'esempio di concorrenza Clojure
- 29. trasposizione matrice nel clojure
- 30. Greatest Common Divisor in Clojure
hai guardato il codice sorgente? – pmdj
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! –
(Non capirò mai alcuni downvotes) –