2010-06-28 21 views
0

我正在使用md5函數將一個字符串散列成32位數的字符串。python壓縮函數返回32位數字串?

str_to_encode = 'this is a test string which I want to encode' 
encoded = hashlib.md5(str_to_encode).hexdigest() 

我希望能夠以該字符串(即,在上面的例子中encoded)回到其原始值進行解碼。我不認爲這是可能的使用MD5(但如果它是請讓我知道),但是有一個壓縮函數,我可以使用哪些會給我一個32位字符串在最後,但可以恢復?

編輯: 被編碼的字符串是一個url,所以最多隻能有幾百個字符,儘管在大多數情況下它會少得多。

感謝

+2

這是怎麼回事?這就像第四個被問及在最後一天左右「解碼md5」的人一樣。 – 2010-06-28 14:05:07

+0

Ha,我不是那種解碼它的興趣,因爲我非常肯定它不能完成。我真正感興趣的是一個函數,它將一個字符串編碼爲一個長度爲32的字符串,然後可以將其轉換/解碼回原始格式。最初我不需要解碼它,只需要它是32長度,這就是爲什麼我使用MD5,但我現在也需要解碼它。 – John 2010-06-28 14:09:23

+2

MD5是一個哈希函數。它不能用於壓縮和解壓縮字符串。 – liviucmg 2010-06-28 14:17:01

回答

4

在我看來,你不是在尋找一個散列或加密,你正在尋找壓縮。嘗試zlib和base64編碼:作爲輸入的增長

s = 'Hello, world' 
encoded = zlib.compress(s).encode('base64') 

編碼數據的長度將增長,但它可能爲你工作。

即使限制自己的網址,也無法將它們可逆地映射到32個字符的字符串,但可能的URL太多。

4

你似乎想兩兩件事不能共存:

  • 任意長度的任何字符串轉換爲正好32個字節,即使它開始爲4GB
  • 的編碼的字符串可解碼而不丟失信息

MD5散列中只有這麼多位,所以通過pigeonhole principle這是不可能的它。如果它是可逆的,你可以使用散列來無限壓縮信息。此外,不可逆性是散列的主要點。他們打算成爲單向功能。加密算法是可逆的,但需要更多的字節來存儲密文,因爲可解密性意味着它們必須是無衝突的(兩個明文不能編碼到相同的密文,或者解密函數不知道哪個明文輸出,因爲密文)

+0

刺痛是一個網址,所以永遠不會那麼長。我不知道網址的最大長度是多少,但如果有幫助的話,看不到多於幾百個字符。 – John 2010-06-28 14:13:53

+0

即使如此,你也不會在32(字節)長度的字符串中適應幾百個字符。也許是32個字符的UTF-32字符串。 – 2010-06-28 14:16:18

+0

@John從技術上講,[沒有限制](http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-an-url),但實際上很長的URL很少見。這聽起來像是在尋找一種壓縮算法,而不是加密或哈希算法 - 是安全問題嗎?我懷疑是否有足夠高效的壓縮算法,但我沒有真正嘗試過 – 2010-06-28 14:16:42