600M 句子的 Java 哈希字符串

标签 java hash

我想检查 600M 阿拉伯语句子的精确重复项(每个句子少于 150 个字符)。因此,我使用 Lucene 对文本及其哈希值建立了索引。 我对文本进行了哈希处理,如下所示:

MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(sentence.getBytes());
int hashValue = new String(digester.digest()).hashCode();

我的索引有以下字段:

text: <sentence>
hash: <hashValue>

我的想法是,我有一个句子列表,我想获得它们的精确重复项,这样我就可以使用它们的哈希值搜索 lucene。

ScoreDoc[] results;
TopScoreDocCollector collector = TopScoreDocCollector.create(1000);
Query rangeQuery = LegacyNumericRangeQuery.newIntRange("hash", hashValue, hashValue, true, true);
searcher.search(rangeQuery, collector);
results = collector.topDocs().scoreDocs;

问题是,当我这样做时,我得到了具有相同哈希值的不同句子!所以,我没能实现我想要的!

所以我想得到以下问题的答案:

  • 如果使用此哈希函数对单词而不是句子进行哈希处理,冲突是否会减少?
  • 有没有更好、集合更少的哈希函数?
  • 有更好的方法来完成我的任务吗?
  • 即使哈希函数使用字节,哈希语言是否也相关,那么它们对于 utf-8 文本来说是更好的哈希吗?

感谢您的回复! 问候, 雷姆

最佳答案

如果您使用 Lucene 对它们进行索引,那么您实际上并不需要哈希值。只需将句子存储为(未标记化的)StringField 并使用带有确切句子的 TermQuery 即可。

关于600M 句子的 Java 哈希字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671983/

相关文章:

Crypt 函数的 Python 用法

algorithm - 从哪里开始 - 密码散列

java - 显示文件名并在 JTree 中的文件夹下选择它

java - 使用 gdx-setup-ui.jar 初始化新项目后出现错误

java - JTable - 列中每个单元格的不同组合框

arrays - 将散列推送到数组的这段 Perl 代码有什么问题?

java - jsoup 发布和 cookie

添加到列表时抛出 java.util.ConcurrentModificationException

java哈希码返回值

c - 64 位乘法哈希