2012-02-16 28 views
5

我有一个java应用程序,我想在其中为字符串生成long标识符(为了将这些字符串存储在neo4j中)。为了避免数据重复,我想为存储在long整数中的每个字符串生成一个id,对于每个字符串应该是唯一的。我怎样才能做到这一点 ?如何生成一个字符串的长散列?

+0

难道你不能只是得到字符串的散列,并将它们存储在neo之前很长时间? – Marthin 2012-02-16 10:38:15

+5

您无法实现“对所有字符串唯一” - 长度为64位,长度为9的字符串为72位,必须有一些字符串将被散列到相同长度 – amit 2012-02-16 10:38:28

+1

您无法获得唯一性,因为存在无限多的字符串,只有有限的多字符。你能更具体地描述你在找什么吗? – templatetypedef 2012-02-16 10:39:07

回答

4

long具有64位。长度为9的String有72位。从pigeon hole principle - 你不能得到一个独特的散列,9字符长字符串到long

如果你还想要一个long哈希:你可以只取两个标准[不同!]的哈希函数String->inthash1()hash2(),并计算:hash(s) = 2^32* hash1(s) + hash2(s)

6

为什么你不看一下String的hashcode()函数,只是采用它来代替long值?

Btw。如果有一种方法可以为每个字符串创建一个唯一的ID,那么您将找到一种压缩算法,可以将每个字符串打包为8个字节(按定义不可能)。

1

有很多答案,请尝试以下操作:

或者,正如之前所说,检查出的来源。

PS。还有一种技术是维护一个字符串字典:因为你不可能很快得到字符串,所以你可以有完美的映射。但请注意,映射也可能成为主要瓶颈。

5

该代码将计算相当好的哈希:

String s = "some string"; 
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits(); 
相关问题