JavaScript的简单(非安全)哈希函数?
2022-08-30 01:50:04
任何人都可以建议用(浏览器兼容的)JavaScript编写一个简单的(即几十行代码,而不是数百行)哈希函数吗?理想情况下,我想要一些东西,当传递字符串作为输入时,产生类似于32个字符的十六进制字符串的东西,这是MD5,SHA1等的典型输出。它不必是加密安全的,只是合理地抵抗碰撞。(我最初的用例是URL,但我将来可能想在其他字符串上使用它。
任何人都可以建议用(浏览器兼容的)JavaScript编写一个简单的(即几十行代码,而不是数百行)哈希函数吗?理想情况下,我想要一些东西,当传递字符串作为输入时,产生类似于32个字符的十六进制字符串的东西,这是MD5,SHA1等的典型输出。它不必是加密安全的,只是合理地抵抗碰撞。(我最初的用例是URL,但我将来可能想在其他字符串上使用它。
我自己没有验证这一点,但你可以看看Java的String.hashCode()方法的JavaScript实现。似乎相当短。
有了这个原型,你可以简单地调用任何字符串,例如,并接收一个数字哈希代码(更具体地说,Java等效代码),例如1395333309。
.hashCode()
"some string".hashCode()
String.prototype.hashCode = function() {
var hash = 0;
for (var i = 0; i < this.length; i++) {
var char = this.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
2022年编辑:
长期以来,人们一直认为修改内置原型是一种不好的做法,因此您应该使用普通函数:
/**
* Returns a hash code from a string
* @param {String} str The string to hash.
* @return {Number} A 32bit integer
* @see http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
*/
function hashCode(str) {
let hash = 0;
for (let i = 0, len = str.length; i < len; i++) {
let chr = str.charCodeAt(i);
hash = (hash << 5) - hash + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
}
有许多用JS编写的哈希函数的实现。例如:
如果你不需要安全性,你也可以使用base64,它不是哈希函数,没有固定的输出,可以简单地由用户解码,但看起来更轻量级,可以用于隐藏值:http://www.webtoolkit.info/javascript-base64.html