2015-06-10 51 views
0

我想每個唯一字符串得到一個唯一的十六進制數。到目前爲止,我正在使用Message Digest類,但是對於兩個唯一字符串,計算的十六進制可能是相同的(對於非常少但仍然可能)。那麼還有什麼其他的方式來做這樣的事情,以便我有獨特的十六進制字符串。java中唯一字符串的唯一十六進制數

在此先感謝。

+1

你是不是指'哈希'?如果是這樣:沒辦法。沒有足夠的不同'int'值來將每個字符串匹配到不同的字符串。另外,'hash'並不是唯一的。爲什麼你需要真正獨特的哈希? –

+0

你是什麼意思「獨特的十六進制」?十六進制是一個數字系統.... – specializt

+1

使用UTF8將字符串轉換爲字節,然後將字節編碼爲十六進制。你將有一個獨特的價值。 –

回答

0

轉換每個字符的十六進制值:

String hex = Arrays.stream(str.split("")) 
    .map(s -> s.charAt(0) + 0) 
    .map(c -> String.format("%4x", c)) 
    .collect(Collectors.joining("")); 
+0

這不會編譯,並且編譯時不需要生成唯一的字符串,因爲不使用左填充。例如,字符[1,0]會產生與字符相同的值[16] –

+0

@jbn是的,我一旦寫完,就意識到了填充的問題。我已經將它更改爲字符串格式與寬度十六進制。編譯的東西 - 好吧,我想我也修正了這個問題。 (小孩忙着睡覺:/) – Bohemian

1

(假設你的意思hash,不hex,既然你提到MessageDigest)。

對於每個唯一字符串,您不能擁有唯一的哈希碼。以這種方式考慮:A hash function將字符串(或任何其他對象)映射到整數。由於每個整數可以表示爲一個字符串,例如, "123",有至少有多少字符串,因爲有不同的整數 - 然後再多一些,比如不是數字的所有東西,例如, "Hello"。因此,由於字符串比整數更多,因此在所有情況下都不可能爲唯一字符串生成唯一的哈希碼。儘管如此,對於「日常散列」(對於散列表等)而言,String.hashCode提供的散列函數大致如它所得。對於cryptographic hashingMessageDigest似乎是要走的路。根據您當前使用的內容,您可能可以升級到更強大的算法,例如, sha-512而不是sha-256

+1

另請參閱[Pigeonhole原理](http://en.wikipedia.org/wiki/Pigeonhole_principle)。 – Jesper

+0

String.hashCode()與MessageDigest根本不在同一聯盟中。發現hashCode()的衝突是微不足道的(並且,BTW構成DOS攻擊的原則),而MessageDigest是一個加密散列,對於這種散列來說,發現衝突幾乎是不可能的。 hashCode()產生一個int(32位)。 MessageDigest通常會產生16-20個字節。 –

+0

@JBNizet不過,我會假設如果你想要一個'int',那麼'String.hashCode'還好嗎?或者它有從未修復的主要缺陷,可能是出於兼容性的原因? –

相關問題