我有一个与MySQL数据库一起使用的Java应用程序。
我希望能够存储长文本并检查表是否包含它们。为此,我想使用索引,并通过减少full_text的“哈希”搜索。
MY_TABLE [
full_text: TEXT
text_hash: varchar(255) - indexed
]
事情是,我不能将String.hashCode()用作:
我想找到一个快速哈希函数,它将读取长文本值并为其生成一个长哈希值,比如长64个符号。
答案 0 :(得分:4)
这种可靠的哈希方法并不快。不过,它们可能足够快。您正在寻找加密消息摘要方法(如用于识别P2P网络中的文件或Git中提交的方法)。查找MessageDigest类,然后选择算法(SHA1,MD5,SHA256等)。
这样的哈希函数将字节作为参数,并产生字节作为结果,因此请确保使用常量编码(例如UTF8)转换字符串,并转换生成的字节数组(通常为16或20个字节)使用十六进制或Base64编码的可读字符串。
答案 1 :(得分:1)
我建议您重新访问String.hashCode()
。
首先,它不会因实施而异。确切的哈希是指定的;请参阅String.hashCode javadoc规范。
其次,尽管String哈希算法不是最好的(并且肯定会有比冲突哈希更多的冲突),但它确实可以很好地将哈希扩展到32位结果上空间。例如,我快速检查了我的机器上的文本文件(/usr/share/dict/web2a
),该文件有235,880个单词,并且有六个碰撞。
第三和第四:String.hashCode()
应该快得多,并且散列值所需的存储空间应该比加密散列要小得多。
如果你在数据库表中存储字符串,并且它们的哈希值被索引,那么发生一些冲突就不重要了。查找字符串应该可以非常快速地获得正确的数据库行,并且与数据库I / O相比,必须(可能)检查几个实际字符串应该非常快。