Hash Clojure映射的极限和一致性

Hash Clojure映射的极限和一致性,hash,map,clojure,hashmap,Hash,Map,Clojure,Hashmap,我想知道,考虑到Clojure在其映射实现中使用32位哈希,Clojure映射是否因此限制了2^32-1个键(如果不是这样,它如何管理冲突),以及它的哈希实现是否正确。 蒂亚 Clojure映射是一种自定义实现,它是持久的、不可变的(即,它不使用Java hashmaps,在不可变的数据结构中使用Java hashmaps将无法提供足够的性能) 它使用32位哈希代码,因此2^32个可能的哈希桶。在发生冲突的情况下,每个哈希桶的键和值都存储在一个数组中,因此可能有超过2^32个键。请参阅-尤其是H

我想知道,考虑到Clojure在其映射实现中使用32位哈希,Clojure映射是否因此限制了2^32-1个键(如果不是这样,它如何管理冲突),以及它的哈希实现是否正确。
蒂亚

Clojure映射是一种自定义实现,它是持久的、不可变的(即,它不使用Java hashmaps,在不可变的数据结构中使用Java hashmaps将无法提供足够的性能)

它使用32位哈希代码,因此2^32个可能的哈希桶。在发生冲突的情况下,每个哈希桶的键和值都存储在一个数组中,因此可能有超过2^32个键。请参阅-尤其是HashCollisionNode内部类,它用于根据单个hashcode值存储一个键/值桶

因为可能的散列桶的数量是固定的,所以一致的散列是不相关的——密钥永远不需要重新映射

另见:

  • (演示文稿解释了Clojure的并发方法,但也涵盖了持久不变的数据结构)

您看过源代码了吗?是的,但我不能完全理解它,因为我不是Java开发人员:据我所知,哈希函数是hasheq,在key是整数的特定情况下,它委托给Integer,并委托给key对象hasheq方法。但是如果映射支持冲突,并且哈希函数是一致的,那么我无法理解(或回溯)所使用的哈希函数!(我永远不会理解一些反对票)对不起,我指的是PersistentHashMap的源代码,它是Java的@米凯拉已经在他的回答中联系到了这一点,并解释了它是如何工作的,所以我想我不会有太多补充。