可能是重复问题:
在Javascript/jQuery中生成哈希值
有人能推荐一个简单的(即代码只有几十行而不是几百行),用(浏览器兼容的)JavaScript编写的哈希函数吗?理想情况下,当输入一个字符串时,它应该产生类似于MD5、SHA1等输出的32个字符的十六进制字符串。它不必是加密安全的,只需要对碰撞有合理的抵抗力。(我最初使用用例是URL,但我将来可能也会在其他字符串上使用它。)
可能是重复问题:
在Javascript/jQuery中生成哈希值
有人能推荐一个简单的(即代码只有几十行而不是几百行),用(浏览器兼容的)JavaScript编写的哈希函数吗?理想情况下,当输入一个字符串时,它应该产生类似于MD5、SHA1等输出的32个字符的十六进制字符串。它不必是加密安全的,只需要对碰撞有合理的抵抗力。(我最初使用用例是URL,但我将来可能也会在其他字符串上使用它。)
我没有亲自验证过,但是您可以查看这篇JavaScript实现Java的String.hashCode()方法。看起来相当简短。
使用这个原型,您可以在任何字符串上简单地调用
.hashCode()
,例如"some string".hashCode()
,并接收一个数值哈希码(更具体地说,是Java等效哈希码),如1395333309。
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年修改:
长期以来,人们普遍认为修改内置原型是不良做法,因此你应该使用一个纯函数(plain function)代替:
/**
* 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;
}
String
的原型,增加一个非 Ecmascript 的方法。我建议将其重写为独立的函数,可以将它放在你的工具库中。 - Huskyvar
关键字,导致创建了一个全局变量 i
。但这些问题可以很容易地被解决。 - Stijn de Wittif (this.length == 0) {return hash}
块,因为它是多余的(for
循环在长度为正时执行,否则默认返回0)。我是否漏掉了什么? - Eugen MihailescuArray.from(str).reduce((hash, char) => 0 | (31 * hash + char.charCodeAt(0)), 0)
(其中 str
是字符串) - Mingwei Samuel有许多用JS编写的哈希函数实现。例如:
如果您不需要安全性,还可以使用base64。Base64不是哈希函数,没有固定输出,并且可以被用户简单解码,但看起来更轻量级,可以用于隐藏值:http://www.webtoolkit.info/javascript-base64.html
简单对象哈希器:
(function () {
Number.prototype.toHex = function () {
var ret = ((this<0?0x8:0)+((this >> 28) & 0x7)).toString(16) + (this & 0xfffffff).toString(16);
while (ret.length < 8) ret = '0'+ret;
return ret;
};
Object.hashCode = function hashCode(o, l) {
l = l || 2;
var i, c, r = [];
for (i=0; i<l; i++)
r.push(i*268803292);
function stringify(o) {
var i,r;
if (o === null) return 'n';
if (o === true) return 't';
if (o === false) return 'f';
if (o instanceof Date) return 'd:'+(0+o);
i=typeof o;
if (i === 'string') return 's:'+o.replace(/([\\\\;])/g,'\\$1');
if (i === 'number') return 'n:'+o;
if (o instanceof Function) return 'm:'+o.toString().replace(/([\\\\;])/g,'\\$1');
if (o instanceof Array) {
r=[];
for (i=0; i<o.length; i++)
r.push(stringify(o[i]));
return 'a:'+r.join(';');
}
r=[];
for (i in o) {
r.push(i+':'+stringify(o[i]))
}
return 'o:'+r.join(';');
}
o = stringify(o);
for (i=0; i<o.length; i++) {
for (c=0; c<r.length; c++) {
r[c] = (r[c] << 13)-(r[c] >> 19);
r[c] += o.charCodeAt(i) << (r[c] % 24);
r[c] = r[c] & r[c];
}
}
for (i=0; i<r.length; i++) {
r[i] = r[i].toHex();
}
return r.join('');
}
}());
// Simple but unreliable function to create string hash by Sergey.Shuchkin [t] gmail.com
// alert( strhash('http://www.w3schools.com/js/default.asp') ); // 6mn6tf7st333r2q4o134o58888888888
function strhash( str ) {
if (str.length % 32 > 0) str += Array(33 - str.length % 32).join("z");
var hash = '', bytes = [], i = 0, j = 0, k = 0, a = 0, dict = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','1','2','3','4','5','6','7','8','9'];
for (i = 0; i < str.length; i++ ) {
ch = str.charCodeAt(i);
bytes[j++] = (ch < 127) ? ch & 0xFF : 127;
}
var chunk_len = Math.ceil(bytes.length / 32);
for (i=0; i<bytes.length; i++) {
j += bytes[i];
k++;
if ((k == chunk_len) || (i == bytes.length-1)) {
a = Math.floor( j / k );
if (a < 32)
hash += '0';
else if (a > 126)
hash += 'z';
else
hash += dict[ Math.floor( (a-32) / 2.76) ];
j = k = 0;
}
}
return hash;
}
j
、k
、a
。原因是因为它们不是var
语句的一部分,仅仅是被评估为var i
表达式的一部分。应该使用 var i, j, k, a; i = j = k = a = 0;
。 - Niet the Dark AbsolуюІуюІУ┐ЎСИфJavaScriptуџёMD5т«ъуј░сђѓт«ЃТў»BSDУ«ИтЈ»У»Ђ№╝їжЮътИИТўЊС║јСй┐ућесђѓСЙІтдѓ№╝џ
md5 = hex_md5("message to digest")
hex_md5(message)
的结果吗? - mjshex_md5("message_digest") = "fb6cecc85a100197ae3ad68d1f9f2886"
的内容,对吧?(我找不到你回答的修订版本。) - mjs
window.hashJoaat=function(b){for(var a=0,c=b.length;c--;)a+=b.charCodeAt(c),a+=a<<10,a^=a>>6;a+=a<<3;a^=a>>11;return((a+(a<<15)&4294967295)>>>0).toString(16)};
。 - Orwellophile