简答
不要这样做。使用 Java 映射。您可以在此处找到详细信息:http:
//docs.oracle.com/javase/6/docs/api/java/util/Map.html
长答案
您可以通过将字符串视为 base-N 中的数字来创建完美的散列函数,其中 N 是任何字符可以采用的所有可能值。这里的问题是内存。散列函数旨在与数组一起使用,这意味着您需要一个足够大的数组来处理散列结果,这是不切实际的。
例如,以 10 个字符的键为例。让我们更加谦虚,假设它们保证只包含小写字母。这为每个字符和 10 个字符提供了 26 种可能性。这意味着可能的组合是:
26 ^ 10 = 141,167,095,653,376
如果您查看散列算法,它们首先包含的内容之一就是碰撞检测,因为它们承认碰撞是生活中的事实。
现在你说你没有在内存中加载键,但你为什么要使用哈希呢?哈希的目的是为您提供到数组索引的映射。也许你最好使用另一种机制。
可能的解决方案
如果您担心内存,请获取有关文件中重复项的一些统计信息。如果您只存储一个标志来指示哈希中特定键的出现,并且您有很多重复项,那么您也许可以只使用 Java 的映射。Java 的映射处理冲突,因此不会阻止您检测唯一键。您可以放心,如果找到 A[x],则意味着 x 在 A 中,即使 x 的哈希与先前的哈希冲突。
接下来,您可以尝试一些实用程序来提取重复项。由于它们是专门为此目的而编写的,因此它们应该能够处理大量数据。
最后,您可以尝试将您的条目放入数据库并使用它来处理重复项。这可能看起来有点矫枉过正,但数据库已针对处理大量记录进行了优化。