JavaScript的简单(非安全)哈希函数?

2022-08-30 01:50:04

可能的重复:
从 Javascript/jQuery 中的字符串生成哈希

任何人都可以建议用(浏览器兼容的)JavaScript编写一个简单的(即几十行代码,而不是数百行)哈希函数吗?理想情况下,我想要一些东西,当传递字符串作为输入时,产生类似于32个字符的十六进制字符串的东西,这是MD5,SHA1等的典型输出。它不必是加密安全的,只是合理地抵抗碰撞。(我最初的用例是URL,但我将来可能想在其他字符串上使用它。


答案 1

我自己没有验证这一点,但你可以看看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;
}

答案 2

有许多用JS编写的哈希函数的实现。例如:

如果你不需要安全性,你也可以使用base64,它不是哈希函数,没有固定的输出,可以简单地由用户解码,但看起来更轻量级,可以用于隐藏值:http://www.webtoolkit.info/javascript-base64.html