2012-02-16 27 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(); 
相關問題