【问题标题】:How to calculate a good hash code for a huge list of strings?如何为大量字符串计算一个好的哈希码?
【发布时间】:2013-01-16 07:11:44
【问题描述】:

根据这些字符串的值一次性计算哈希码的最佳方法是什么?

我的意思是它必须是:

1 - 快速:我需要获取大量短字符串列表(10^3..10^8 项)的哈希码。

2 - 识别整个数据列表,这么多列表可能只有几个不同的字符串必须具有不同的哈希码

如何在 Java 中做到这一点?

也许有一种方法可以使用现有的字符串哈希码,但是如何合并为单独的字符串计算的许多哈希码?

谢谢。

【问题讨论】:

  • 你想要哈希码做什么?您只想要一个哈希值,还是每个字符串一个哈希值?
  • 你想要 hash code 值比如 java 已经有 hashCode() 方法返回一个 int 的 String 还是你想要像 MD5 摘要这样的哈希值?
  • 为什么不使用内置的hashCode() 方法? List 扩展 AbstractList 的实现确实从其元素的哈希码中计算其值。
  • 哈希码必须是顺序敏感的吗?即{"a", "b", "c"} 的哈希码应该与{"a", "c", "b"} 的哈希码相同还是不同?
  • 这个问题太模棱两可了......而且OP没有澄清它。是时候关闭它了...

标签: java string performance hash hashcode


【解决方案1】:

为您的字符串创建一个占位符类,然后使用CRC32 class。它简单快捷:

import java.util.zip.CRC32;

public class HugeStringCollection {
    private Collection<String> strings;

    public HugeStringCollection(Collection<String> strings) {
        this.strings = strings;
    }

    public int hashCode() {
        CRC32 crc = new CRC32();
        for(String string : strings) {
            crc.update(string.getBytes())
        }

        return (int)( crc.getValue() );
    }
}

如果集合本身是不可变的,您可以计算一次哈希并将其存储以供后期重用。

【讨论】:

  • 多年来广泛用于文件处理,例如在 ZIP 压缩中
  • @mantrid 如何将其转换为适用于字符数组列表?因为我猜我们没有 getBytes 字符!?
  • String.join(myArrayList).getBytes() 我想。
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 2015-04-22
  • 2012-07-12
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2011-11-02
  • 2011-07-20
相关资源
最近更新 更多