如何生成String的长哈希?
我有一个java applciation,我想在其中生成字符串的long
id(为了在neo4j中存储这些字符串)。 为了避免数据重复,我想为存储在一个long
整数中的每个字符串生成一个id,对于每个字符串应该是唯一的。 我怎样才能做到这一点 ?
long
有64位。 长度为9的String
有72位。 从鸽子洞的原则 – 你不能得到一个独特的哈希9长字符long
。
如果你仍然想要一个long
哈希:你可以为hash1()
String->int
, hash1()
和hash2()
获取两个标准的[不同!]哈希函数并计算: hash(s) = 2^32* hash1(s) + hash2(s)
这段代码将计算相当不错的哈希:
String s = "some string"; long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits();
你为什么不看看String的hashcode()
函数,只是采用它来代替长值?
顺便说一句。 如果有办法为每个String创建一个唯一的ID,那么你会找到一个压缩算法,它能够将每个String打包成8个字节(根据定义不可能)。
有很多答案,请尝试以下方法:
-
http://stackoverflow.com/questions/415953/generate-md5-hash-in-java编辑:删除,我错过了long
要求。 Mea culpa。 - http://en.wikipedia.org/wiki/Perfect_hash_function
或者,如前所述,查看来源。
PS。 另一种技术是维护字符串字典:因为你很快就不可能获得2 64个字符串,所以你可以拥有完美的映射。 请注意,映射可能也成为主要瓶颈。