java - 是否有特定于 URL 的 hashCode 方法?

标签 java algorithm url caching hashcode

有没有一种方法可以高效地“生成”URL 的内存?

目前我有一个缓存ala Set<String>对于我的 URL,我可以很容易地检查 URL 是否已经被我的抓取工具解析。现在这需要大量内存,我将其替换为 Set<Long>并使用了 URL 的 hashCode。现在的问题是即使对于 40k 的 URL 也有 10 个冲突。使用 long 而不是 int hashCode 的改进方法将其改进为 6 个冲突,但特别是短 url 在开始时看起来非常相似会产生问题:

5852015146777169869 http://twitpic.com/5xuwukhttp://twitpic.com/5xuw7m 5852015146777169869

所以我最终采用了以下特定于 URL 的双哈希方法,该方法对 2.5mio URL 没有冲突,这对我来说很好:

public static long urlHashing(String str) {
    if (str.length() < 2)
        return str.hashCode();

    long val = longHashCode(str, 31, false);
    if (str.length() > 3)
        // use the end of the string because those short URLs
        // are often identical at the beginning
        return 43 * val + longHashCode(str.substring(str.length() / 2), 37, true);
    return val;
}

public static long longHashCode(String str, int num, boolean up) {
    int len = str.length();
    if (len == 0)
        return 0;

    long h = 0;
    // copying to a temp arry is a only a tiny bit slower in our case.
    // so this here is ~2ms faster for 40k urls
    if (up)
        for (int i = 0; i < len;) {
            h = num * h + str.charAt(i++);
        }
    else
        for (int i = len - 1; i >= 0;) {
            h = num * h + str.charAt(i--);
        }

    return h;
}

但是现在我想知道:是否有一些关于 URL 特定哈希算法的理论或 (google ;)) 论文?或者简单地说:我可以进一步减少 URL 的冲突吗?或者您认为我当前的解决方案有任何问题或改进吗?

更新:

  • 另一种方法是按协议(protocol)、地址和文件分隔 URL,就像在 new URL(str).hashCode() 中所做的那样。方法(不能直接使用,因为它非常慢 -> 它即时解析 URL :/)
  • 参见 squid-cache.orgCacheDigest explanation

最佳答案

如果您想要始终有效的东西,而不仅仅是大部分时间,那么短哈希值不会削减它。正如您所观察到的,在任何长度小于 128 位的情况下,即使是理想的散列也会有很大的冲突率。你遇到的是一个缩放问题,你通过使用哈希码所做的就是减少常数因子——它仍然是 O(n)。

虽然听起来您的字符串有很多共同的前缀 - 您是否考虑过使用 trie 来存储它们?

关于java - 是否有特定于 URL 的 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886571/

相关文章:

java - 为什么我应该签署我的 JAR 文件?

c - 在字符串数组中插入字符串

php - 如何使用 .htaccess 隐藏网页名称后的所有内容

javascript - 使用 jQuery/Javascript (querystring) 获取查询字符串参数 url 值

javascript - 无法将变量传递到javascript中的ajax url

java - Android:Html TextView - 这可能吗?

java - 从日志文件到 wan 的持续数据馈送

java - 如何使用java连接到google存储API

java - 我怎样才能加快我的多数元素问题集的以下算法?

algorithm - 通过函数从向量中获取成对/三重/四重...元素