我有一个用于MySQL数据库的Java应用程序。
我希望能够存储长文本,并检查表是否包含它们。为此,我希望使用索引,并通过减少full_text的“哈希”进行搜索。
MY_TABLE [
full_text: TEXT
text_hash: varchar(255) - indexed
]问题是,我不能将String.hashCode()用作:
我希望找到一个快速散列函数,它将读取长文本值并为其生成一个长散列值,比如64个符号长。
发布于 2014-07-25 16:00:53
这种可靠的散列方法并不快。不过,它们可能够快的。您正在寻找加密消息摘要方法(类似于用于标识P2P网络中的文件或在Git中提交文件的方法)。查找MessageDigest类,并选择算法(SHA1、MD5、SHA256等)。
这样的哈希函数将以字节作为参数,并生成字节作为结果,因此确保使用常量编码(例如UTF8)转换字符串,并使用十六进制或Base64编码将生成的字节数组(通常为16或20字节)转换为可读字符串。
发布于 2014-07-26 04:01:47
我建议你再去看看String.hashCode()。
首先,它不会因实现的不同而有所不同。指定了确切的散列;请参阅String.hashCode javadoc规范。
其次,虽然字符串哈希算法并不是最好的(当然,它会比密码散列算法有更多的冲突),但它在32位结果空间中传播散列确实做得相当好。例如,我快速检查了我的机器上的一个文本文件(/usr/share/dict/web2a),它有235,880个单词,并且发生了6冲突。
第三和第四:String.hashCode()应该比加密哈希要快得多,哈希值所需的存储应该比加密散列小得多。
如果您将字符串存储在数据库表中,并且将其哈希值编入索引,那么发生一些冲突并不重要。查找一个字符串会让您很快找到正确的数据库行,与数据库I/O相比,必须(可能)检查几个实际字符串的速度应该非常快。
https://stackoverflow.com/questions/24959804
复制相似问题