我想每個唯一字符串得到一個唯一的十六進制數。到目前爲止,我正在使用Message Digest類,但是對於兩個唯一字符串,計算的十六進制可能是相同的(對於非常少但仍然可能)。那麼還有什麼其他的方式來做這樣的事情,以便我有獨特的十六進制字符串。java中唯一字符串的唯一十六進制數
在此先感謝。
我想每個唯一字符串得到一個唯一的十六進制數。到目前爲止,我正在使用Message Digest類,但是對於兩個唯一字符串,計算的十六進制可能是相同的(對於非常少但仍然可能)。那麼還有什麼其他的方式來做這樣的事情,以便我有獨特的十六進制字符串。java中唯一字符串的唯一十六進制數
在此先感謝。
轉換每個字符的十六進制值:
String hex = Arrays.stream(str.split(""))
.map(s -> s.charAt(0) + 0)
.map(c -> String.format("%4x", c))
.collect(Collectors.joining(""));
這不會編譯,並且編譯時不需要生成唯一的字符串,因爲不使用左填充。例如,字符[1,0]會產生與字符相同的值[16] –
@jbn是的,我一旦寫完,就意識到了填充的問題。我已經將它更改爲字符串格式與寬度十六進制。編譯的東西 - 好吧,我想我也修正了這個問題。 (小孩忙着睡覺:/) – Bohemian
(假設你的意思hash
,不hex
,既然你提到MessageDigest)。
對於每個唯一字符串,您不能擁有唯一的哈希碼。以這種方式考慮:A hash function將字符串(或任何其他對象)映射到整數。由於每個整數可以表示爲一個字符串,例如, "123"
,有至少有多少字符串,因爲有不同的整數 - 然後再多一些,比如不是數字的所有東西,例如, "Hello"
。因此,由於字符串比整數更多,因此在所有情況下都不可能爲唯一字符串生成唯一的哈希碼。儘管如此,對於「日常散列」(對於散列表等)而言,String.hashCode
提供的散列函數大致如它所得。對於cryptographic hashing,MessageDigest
似乎是要走的路。根據您當前使用的內容,您可能可以升級到更強大的算法,例如, sha-512
而不是sha-256
。
另請參閱[Pigeonhole原理](http://en.wikipedia.org/wiki/Pigeonhole_principle)。 – Jesper
String.hashCode()與MessageDigest根本不在同一聯盟中。發現hashCode()的衝突是微不足道的(並且,BTW構成DOS攻擊的原則),而MessageDigest是一個加密散列,對於這種散列來說,發現衝突幾乎是不可能的。 hashCode()產生一個int(32位)。 MessageDigest通常會產生16-20個字節。 –
@JBNizet不過,我會假設如果你想要一個'int',那麼'String.hashCode'還好嗎?或者它有從未修復的主要缺陷,可能是出於兼容性的原因? –
你是不是指'哈希'?如果是這樣:沒辦法。沒有足夠的不同'int'值來將每個字符串匹配到不同的字符串。另外,'hash'並不是唯一的。爲什麼你需要真正獨特的哈希? –
你是什麼意思「獨特的十六進制」?十六進制是一個數字系統.... – specializt
使用UTF8將字符串轉換爲字節,然後將字節編碼爲十六進制。你將有一個獨特的價值。 –