JavaScript的简单(非安全)散列函数?

可能重复:
在Javascript / jQuery中从string生成哈希

任何人都可以提出一个简单的(即几十行代码,而不是几百行)散列函数写在(浏览器兼容)的JavaScript? 理想情况下,我希望当传递一个string作为input时,会产生类似于32位字符的hexstring,这是MD5,SHA1等的典型输出。它不必是encryption安全的,只是合理地抵抗冲突。 (我最初的用例是URL,但是我将来可能会在其他string上使用它。)

我没有自己validation,但你可以看看Java的String.hashCode()方法的JavaScript实现 。 似乎很短。

使用这个原型,你可以简单地在任何string上调用.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++) { char = this.charCodeAt(i); hash = ((hash<<5)-hash)+char; hash = hash & hash; // Convert to 32bit integer } return hash; } 

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

  • SHA-1: http : //www.webtoolkit.info/javascript-sha1.html
  • SHA-256: http : //www.webtoolkit.info/javascript-sha256.html
  • MD5: http : //www.webtoolkit.info/javascript-md5.html

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

本文将详细解释简单的哈希函数 ,并提供一些非常直接的示例代码(C语言)。 看起来Bob Jenkins的哈希函数可能适合您的需要(这个Dr Dobbs文章有更多的细节和其他哈希函数的调查,这两个都可能是有用的)。

查看这个JavaScript的MD5实现 。 它的BSD许可,非常容易使用。 例:

 md5 = hex_md5("message to digest") 

简单对象散列器:

 (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(''); } }()); 

这里的肉是串行器,它只是将任何对象转换成一个唯一的string。 然后hashCode运行该对象,将string化对象的字符散列在一起。

对于额外的点,导出string并创build一个分析器。

 // 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 = j = k = 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; }