首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中将长字符串“散列”为String[64]

如何在Java中将长字符串“散列”为String[64]
EN

Stack Overflow用户
提问于 2014-07-25 15:57:31
回答 2查看 1.1K关注 0票数 1

我有一个用于MySQL数据库的Java应用程序。

我希望能够存储长文本,并检查表是否包含它们。为此,我希望使用索引,并通过减少full_text的“哈希”进行搜索。

代码语言:javascript
复制
MY_TABLE [
    full_text: TEXT
    text_hash: varchar(255) - indexed
]

问题是,我不能将String.hashCode()用作:

  1. 实现可能因JVM版本而异。
  2. 值太短,这意味着许多冲突。

我希望找到一个快速散列函数,它将读取长文本值并为其生成一个长散列值,比如64个符号长。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-25 16:00:53

这种可靠的散列方法并不快。不过,它们可能够快的。您正在寻找加密消息摘要方法(类似于用于标识P2P网络中的文件或在Git中提交文件的方法)。查找MessageDigest类,并选择算法(SHA1、MD5、SHA256等)。

这样的哈希函数将以字节作为参数,并生成字节作为结果,因此确保使用常量编码(例如UTF8)转换字符串,并使用十六进制或Base64编码将生成的字节数组(通常为16或20字节)转换为可读字符串。

票数 4
EN

Stack Overflow用户

发布于 2014-07-26 04:01:47

我建议你再去看看String.hashCode()

首先,它不会因实现的不同而有所不同。指定了确切的散列;请参阅String.hashCode javadoc规范。

其次,虽然字符串哈希算法并不是最好的(当然,它会比密码散列算法有更多的冲突),但它在32位结果空间中传播散列确实做得相当好。例如,我快速检查了我的机器上的一个文本文件(/usr/share/dict/web2a),它有235,880个单词,并且发生了6冲突。

第三和第四:String.hashCode()应该比加密哈希要快得多,哈希值所需的存储应该比加密散列小得多。

如果您将字符串存储在数据库表中,并且将其哈希值编入索引,那么发生一些冲突并不重要。查找一个字符串会让您很快找到正确的数据库行,与数据库I/O相比,必须(可能)检查几个实际字符串的速度应该非常快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24959804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档