代码之家  ›  专栏  ›  技术社区  ›  flashnik

如何检查我的自定义哈希在哈希映射中是否良好?

  •  2
  • flashnik  · 技术社区  · 14 年前

    我在stdext::hash_map中为我的自定义密钥编写了一个自定义散列,并想检查散列器是否良好。我用的是VS2008提供的STL。我知道,一个典型的检查是检查桶之间分配的均匀性。

    我应该如何正确地组织这样的检查?我想到的一个解决方案是修改stl源代码,在hash_映射中添加一个方法,该方法遍历bucket并完成主题。有更好的办法吗?

    也许,从散列映射派生并在那里创建这样的方法?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Arun    14 年前

    我会通过stl::hash_map运行一个(大)数据集。完成后,我将使用以下方法收集所有bucket的结果

    hash_map :

    size_type elems_in_bucket (size_type __n) const;
    

    最后,我会计算 标准偏差(SD) 元素到桶分配 .

    我会为不同的散列函数执行上述操作。无论哪一个哈希函数产生的最小sd都是赢家(对于这个数据集)。

        2
  •  3
  •   Sniggerfardimungus    14 年前

    最好的办法可能是将哈希算法带到一个int数组中,并在给定真实数据的情况下计算每个哈希桶被击中的次数。(我建议把stl从等式中去掉,真的。)

    如果您最终看到大量真实数据的计数出现高偏差,那么当有大量空(或空)桶可用时,哈希算法将生成大量冲突。

    注意,“高偏差”是一个相对术语。一个好的散列算法是一个确定性的随机过程,任何随机过程都有可能产生奇怪的结果,所以要经常测试,测试好,并且尽可能使用实际的问题域作为测试和控件的源。