2017-06-26 59 views
0

我在JavaScript中有一個很大的json字符串,我想轉換成一個短散列,並且這個solution似乎工作。有沒有辦法反轉這個JavaScript哈希函數?

String.prototype.hashCode = function(){ 
    var hash = 0; 
    if (this.length == 0) return hash; 
    for (i = 0; i < this.length; i++) { 
     char = this.charCodeAt(i); 
     hash = ((hash<<5)-hash)+char; 
     hash = hash & hash; // Convert to 32bit integer 
    } 
    return hash; 
} 

但是有沒有一種方法可以將其轉換回該json字符串?

+0

簡短的回答是否定的。哈希不包含重建輸入所需的信息。 – smcd

+0

它可能是「可能的」,但你不應該。這是不可靠的,哈希意味着一個方法。 – Damon

回答

2

哈希值具體是不可逆的。這是他們的主要特性之一,使他們在密碼學中有用。

我覺得問題是:你究竟在做什麼?因爲不管它是什麼,這聽起來像一個哈希不是答案。

https://en.wikipedia.org/wiki/Hash_function

加密哈希函數允許人們容易地確認某些 輸入數據映射到給定的散列值,但是,如果輸入數據是 未知,它是故意難以重建它 (或等效 備選方案)通過了解存儲的散列值。

(重點煤礦)

你想要的是不是散列但壓縮。尋找一個JavaScript的zip模塊。對於純文本JSON,您可能預期壓縮比率爲〜90%(取決於內容)。一個快速的谷歌搜索顯示,有一百萬,所以你必須找到一個適合你的具體用例。

+0

然後我想我可以把這個問題改寫成,我可以以某種方式將一長串的字符串編碼成一個較短的字符串,然後我可以將它反轉回原來的字符串。這不是機密或任何東西。這只是一個長度問題。 – omega

+3

你想要的不是散列,而是壓縮。尋找一個JavaScript的zip模塊。對於純文本JSON,您可能預期壓縮比率爲〜90%(取決於內容) –

1

不,沒有辦法將散列轉換回它創建的字符串。散列函數的作用是將每個長字符串映射到一個較短的字符串 - 很容易證明,比現有字符創建的短字符串更多的是長字符串。

有多個字符串映射到每個散列字符串,並且不可能確定哪個字符串用於創建散列字符串。你不可能找到兩個映射到相同散列字符串的字符串,這是散列函數的基礎,但同時它們確實存在。

事實上,散列函數是加密安全的,因爲如果只有散列和散列函數,就不可能確定散列創建的字符串。