在前端開發中,JavaScript 哈希函數起到了很重要的作用。哈希函數將輸入值轉換為固定長度的字符串(哈希值),通常用于數據加密、數據校驗、密碼管理等領域。下面我們來詳細了解一下 JavaScript 哈希函數。
JavaScript 中的哈希函數種類很多,比較常見的有:
function hashFnv32a(str) { let hash = 0x811c9dc5; for (let i = 0; i< str.length; i++) { hash ^= str.charCodeAt(i); hash += (hash<< 1) + (hash<< 4) + (hash<< 7) + (hash<< 8) + (hash<< 24); } return hash >>>0; }
其中,hashFnv32a
函數是一種傳統的哈希函數,常用于對字符串進行哈希計算。
下面我們來看一個例子:
const str = 'JavaScript'; const hash = hashFnv32a(str); console.log(hash);
輸出結果為:3619309596
可以看到,通過hashFnv32a
函數對字符串JavaScript
進行哈希計算后得到的哈希值為3619309596
。
不同的哈希函數有不同的哈希值計算方法。例如,下面的elfHash
函數計算字符串哈希值的方法如下:
function elfHash(str) { let hash = 0, i; for (i = 0; i< str.length; i++) { hash = (hash<< 4) + str.charCodeAt(i); let x = hash & 0xF0000000; if (x != 0) { hash ^= x >>24; } hash &= ~x; } return hash >>>0; }
下面是一個例子:
const str = 'JavaScript'; const hash = elfHash(str); console.log(hash);
輸出結果為:4070087935
可以看到,通過elfHash
函數對字符串JavaScript
進行哈希計算后得到的哈希值為4070087935
。
除了字符串,JavaScript 哈希函數還可以對數字、布爾值、數組、對象等數據類型進行哈希計算。例如,下面的simpleHash
函數可以對數字、布爾值、字符串等數據類型進行哈希計算:
function simpleHash(value) { if (typeof value === 'number' || typeof value === 'boolean') { return value.toString(); } else if (typeof value === 'string') { let hash = 0; for (let i = 0; i< value.length; i++) { hash += value.charCodeAt(i) * (i + 1); } return hash.toString(); } else if (Array.isArray(value)) { let hash = ''; for (let i = 0; i< value.length; i++) { hash += simpleHash(value[i]); } return hash; } else if (typeof value === 'object') { let hash = ''; for (let key in value) { if (value.hasOwnProperty(key)) { hash += key + simpleHash(value[key]); } } return hash; } }
下面是一個例子:
const data = [1, true, 'JavaScript', { name: 'Jack', age: 25 }]; const hash = simpleHash(data); console.log(hash);
輸出結果為:1true7401470111111177978375854656780nameJackage25
可以看到,通過simpleHash
函數對數組[1, true, 'JavaScript', { name: 'Jack', age: 25 }]
進行哈希計算后得到的哈希值為1true7401470111111177978375854656780nameJackage25
。
總之,JavaScript 哈希函數可以對各種類型的數據進行哈希計算,應用廣泛,是前端開發工程師不可或缺的知識點之一。