2012-12-06 32 views
0

我需要將長度爲60-100個字符的可變長度字符串轉換爲16個字符的唯一字符串。請注意,輸入也是唯一的。是否有一些現有的哈希算法可以使用?還是有另一種方式可以實現?如何將可變長度的字符串轉換爲16個字符的字符串?

+0

如何做這樣的事情:http://stackoverflow.com/questions/8499550/generate-md5-hash-in-java-output-16-character?該解決方案對所使用的散列函數是不可知的,所以如果您關心安全性,則可以使用比MD5更好的算法。 – Kitsune

+0

這不是哈希如何工作。您正在尋找壓縮。將100個字符壓縮爲16是高度數據特定的。你說輸入是「獨特的」;它是預定的嗎?也就是說,你知道每個輸入值會是什麼嗎?如果沒有,你可能無法達到你想要的。 請發佈有關您的數據的更多信息。 –

回答

0

可變長度60的字符串唯一可以有很多超過16個長度的字符串。

所以一般的,好的算法是不可能的。這就像從每個字母唯一的(A-Z)的一個數字(0-9)

0

散列函數不具有由鴿巢原理獨特輸出產生。如果你確實是有小於< 2^16個不同的輸入,這是可能,但這不是任何散列函數,我知道的一個設計目標,你必須創建的所有知識的散列函數輸入。所以你不得不效仿它。這是合理有效的,最簡單的方案似乎是:

  • 保持關聯數組從輸入字符串到整數
  • 當散列字符串,看看它的關聯數組中
    • 如果是關聯數組中,返回相關的值
    • 否則,讓map[input] = map.entry_count()並返回

這將爲每個輸入分配一個唯一的整數,並在O(1)期望時間或O(log n)時間內進行散列,但需要一定的空間。然後,您可以轉換這個整數爲字符串,如果你一定要,例如用base64編碼,十六進制表示,或將其解釋爲在某些字符編碼字符串(雖然你要照顧與有效字符串結束)。其中每一個給你的結果遠遠超過10^16個,並且使得字符串不太可能被數字混淆。

相關問題