代码之家  ›  专栏  ›  技术社区  ›  Tim Diekmann suresh madaparthi

我可以直接使用哈希映射中的哈希吗?

  •  1
  • Tim Diekmann suresh madaparthi  · 技术社区  · 6 年前

    是否可以在 HashMap 直接用 Hash 提供,以便我可以缓存散列?

    我想这样做:

    map.insert(key, "value");
    
    let hashed_key = {
        let mut hasher = map.hasher().build_hasher();
        key.hash(&mut hasher);
        hasher.finish()
    };
    
    assert_eq!(map.get(key).unwrap(), map.get_by_hash(hashed_key).unwrap());
    

    playground

    1 回复  |  直到 6 年前
        1
  •  8
  •   Matthieu M.    6 年前

    不。

    这在算法层面上是根本不可能的。

    根据设计,哈希操作是 满射的 :多个元素可以哈希到相同的值。因此,任何hashmap实现都只能将hash用作 暗示 然后必须使用 完全相等比较 检查 暗示 是不是正确的元素。

    最好的 ,一个 get_by_hash 方法将返回 Iterator 与当前哈希匹配的所有可能元素。

    对于退化的情况,考虑一个总是返回 4 (通过掷骰子获得)。您希望它返回哪个元素?


    解决问题

    如果 缓存 是你想要的,语言中的诀窍 HashBuilder 是预先散列(并缓存)密钥内部的散列。

    它需要缓存完整的键(因为等式检查),但是散列是一个非常简单的操作(返回缓存的值)。

    但是,它并没有加快相等性检查的速度,这取决于值可能非常昂贵。

    你可以调整图案以适应生锈,尽管你会失去使用 哈希生成器 是的。