在前端開發(fā)中,JavaScript 哈希函數(shù)起到了很重要的作用。哈希函數(shù)將輸入值轉(zhuǎn)換為固定長度的字符串(哈希值),通常用于數(shù)據(jù)加密、數(shù)據(jù)校驗(yàn)、密碼管理等領(lǐng)域。下面我們來詳細(xì)了解一下 JavaScript 哈希函數(shù)。
JavaScript 中的哈希函數(shù)種類很多,比較常見的有:
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
函數(shù)是一種傳統(tǒng)的哈希函數(shù),常用于對字符串進(jìn)行哈希計(jì)算。
下面我們來看一個(gè)例子:
const str = 'JavaScript'; const hash = hashFnv32a(str); console.log(hash);
輸出結(jié)果為:3619309596
可以看到,通過hashFnv32a
函數(shù)對字符串JavaScript
進(jìn)行哈希計(jì)算后得到的哈希值為3619309596
。
不同的哈希函數(shù)有不同的哈希值計(jì)算方法。例如,下面的elfHash
函數(shù)計(jì)算字符串哈希值的方法如下:
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; }
下面是一個(gè)例子:
const str = 'JavaScript'; const hash = elfHash(str); console.log(hash);
輸出結(jié)果為:4070087935
可以看到,通過elfHash
函數(shù)對字符串JavaScript
進(jìn)行哈希計(jì)算后得到的哈希值為4070087935
。
除了字符串,JavaScript 哈希函數(shù)還可以對數(shù)字、布爾值、數(shù)組、對象等數(shù)據(jù)類型進(jìn)行哈希計(jì)算。例如,下面的simpleHash
函數(shù)可以對數(shù)字、布爾值、字符串等數(shù)據(jù)類型進(jìn)行哈希計(jì)算:
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; } }
下面是一個(gè)例子:
const data = [1, true, 'JavaScript', { name: 'Jack', age: 25 }]; const hash = simpleHash(data); console.log(hash);
輸出結(jié)果為:1true7401470111111177978375854656780nameJackage25
可以看到,通過simpleHash
函數(shù)對數(shù)組[1, true, 'JavaScript', { name: 'Jack', age: 25 }]
進(jìn)行哈希計(jì)算后得到的哈希值為1true7401470111111177978375854656780nameJackage25
。
總之,JavaScript 哈希函數(shù)可以對各種類型的數(shù)據(jù)進(jìn)行哈希計(jì)算,應(yīng)用廣泛,是前端開發(fā)工程師不可或缺的知識(shí)點(diǎn)之一。