当前位置: 首页 > 知识库问答 >
问题:

一种更快的散列函数

商正浩
2023-03-14

提前道谢。

共有1个答案

狄冠宇
2023-03-14

我将查看String和HashMap的代码,因为它们的冲突率很低,并且不使用%和处理负数。

从字符串的源

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

从HashMap的源代码

/**
 * Retrieve object hash code and applies a supplemental hash function to the
 * result hash, which defends against poor quality hash functions.  This is
 * critical because HashMap uses power-of-two length hash tables, that
 * otherwise encounter collisions for hashCodes that do not differ
 * in lower bits. Note: Null keys always map to hash 0, thus index 0.
 */
final int hash(Object k) {
    int h = 0;
    if (useAltHashing) {
        if (k instanceof String) {
            return sun.misc.Hashing.stringHash32((String) k);
        }
        h = hashSeed;
    }

    h ^= k.hashCode();

    // This function ensures that hashCodes that differ only by
    // constant multiples at each bit position have a bounded
    // number of collisions (approximately 8 at default load factor).
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}
        hash = (null != key) ? hash(key) : 0;
        bucketIndex = indexFor(hash, table.length);
/**
 * Returns index for hash code h.
 */
static int indexFor(int h, int length) {
    return h & (length-1);
}
 类似资料:
  • 散列函数非常有用,几乎出现在所有信息安全应用程序中。 哈希函数是将数字输入值转换为另一个压缩数值的数学函数。 散列函数的输入具有任意长度,但输出始终具有固定长度。 散列函数返回的值称为message digest或简称hash values 。 下图说明了散列函数。 Java提供了一个名为MessageDigest的类,它属于java.security包。 此类支持诸如SHA-1,SHA 256,

  • 问题内容: 我试图弄清楚自己是否走对了。我正在构建(实时)统计/分析服务,并且使用redis存储一些集合和哈希。 现在,让我们假设我取得了一些成功,并且需要扩展。哈希环技术看起来不错,但是我有一个印象,它仅适用于缓存方案。 如果节点出现故障怎么办?从理论上讲,它的密钥现在由其他节点拥有。实际上,他们将没有数据。丢了吧?与添加/删除节点相同。 我错过了一些基本的东西吗?这可以是一个穷人的集群吗? 问

  • 假设我有一个哈希数据结构,构造如下: 在这种情况下,如何按值从最大到最小对键进行排序?然后我想打印出最高的两个。这是一个大致的想法,但我知道这是错误的: 我想要打印代码(空格以制表符分隔):

  • 根据关键码值(Key value)直接进行访问的数据结构;它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放记录的数组叫做散列表。

  • 我是编程的新手,正在苦苦思索如何使用简单的散列函数。 例如,我把下面的代码放在一起测试RS散列函数(用C表示),我不断得到一个SegFault。 也许我错实现了这个功能...我尝试了一些其他简单的散列函数(例如PJW),也得到了SegFaults。 我确实消除了函数的一个原始参数(无符号int长度)(因为我正在完成一个习题集,并且我们的散列函数的规范是它应该只接受一个常量字符串作为输入),但我认为

  • 考虑 HashSet 作为一个 HashMap,在此处我们只关心键(HashSet<T> 实际上只是一个包围 HashMap<T, ()> 的装包(wrapper))。(原文:Consider a HashSet as a HashMap where we just care about the keys (HashSet<T> is, in actuality, just a wrapper a