mjs*_*mjs 116 javascript hash md5 sha1
任何人都可以建议一个简单的(即数十行代码,而不是数百行)散列函数(与浏览器兼容)JavaScript?理想情况下,我想要一些东西,当传递一个字符串作为输入时,产生类似于32字符十六进制字符串的东西,它是MD5,SHA1等的典型输出.它不一定是加密安全的,只是合理地抵抗冲突.(我的初始用例是URL,但我可能希望将来在其他字符串上使用它.)
小智 118
我自己没有验证这一点,但你可以看看Java的String.hashCode()方法的JavaScript实现.似乎相当短.
使用此原型,您可以简单地调用
.hashCode()
任何字符串,例如"some string".hashCode()
,并接收数字哈希码(更具体地说,Java等价物),例如1395333309.
String.prototype.hashCode = function() {
var hash = 0;
if (this.length == 0) {
return hash;
}
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;
}
Run Code Online (Sandbox Code Playgroud)
用JS编写的哈希函数有很多实现.例如:
如果你不需要安全性,你也可以使用不是哈希函数的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('');
}
}());
Run Code Online (Sandbox Code Playgroud)
这里的核心是字符串生成器,它只是将任何对象转换为唯一的字符串。然后 hashCode 对该对象运行,将字符串化对象的字符散列在一起。
为了获得额外的好处,请导出字符串生成器并创建一个解析器。