【问题标题】:Clojure map limits and consistencyClojure 映射限制和一致性
【发布时间】:2012-06-18 12:29:44
【问题描述】:

我想知道,考虑到 Clojure 使用 32 位哈希来实现其映射,如果 Clojure 映射因此具有 2^32-1 个键的限制(如果不是这样,它如何管理冲突)和如果它的散列实现是consistent。 蒂亚!

【问题讨论】:

  • 你看过源代码吗?
  • 是的,但是我不能完全理解它,因为我不是 Java 开发人员:据我所知,哈希函数是 hasheq,它在特定情况下委托给 Integer,即 key 是 Integer 并且关键对象 hasheq 方法。但是我无法理解(或回溯)使用的哈希函数,如果地图支持冲突并且哈希函数是否一致!
  • (我永远不会理解一些反对意见)
  • 对不起,我指的是 PersistentHashMap 的源代码,它是 Java 语言。 @mikera 已经在他的回答中链接到它并解释了它是如何工作的,所以我认为我没有太多要补充的。

标签: hash map clojure hashmap


【解决方案1】:

Clojure 映射是一种自定义实现,它持久且不可变(即它确实使用 Java 哈希映射,当用于不可变数据结构时无法提供足够的性能)。

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

由于可能的哈希桶的数量是固定的,因此一致的哈希是无关紧要的 - 永远不需要重新映射密钥。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2015-08-02
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多