本文汇总了 JavaScript 中实现 hashCode 函数的多种代码方案,重点解析如何利用位运算符强制结果符合 32 位整数规范。内容涵盖基础函数实现、String 原型扩展方法以及针对复杂对象序列化的处理技巧,帮助开发者在前后端交互或数据校验场景中获取与 Java 等效的哈希值。
JavaScript hashCode 实现概述
为了提升使用的便捷性,对原有实现进行了适度优化。
基础函数实现
function hashcode(str) {
var hash = 0, i, chr, len;
if (str.length === 0) return hash;
for (i = 0, len = str.length; i < len; i++) {
chr = str.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
}
hashcode("this is a string")
//-1853110172以下代码源自 newasp 系统内置的 hashCode 实现逻辑。
String 原型扩展方案
String.prototype.hashCode = function() {for (var a = 31,b = 0,c = this.length; b < c;) a ^= (a << 5) + (a >> 2) + this.charCodeAt(b++);return a};上述实现仅接受 String 类型参数,若需处理其他数据类型,可先进行统一格式化,例如:
hashcode(JSON.stringify(obj)) 通过序列化后再调用 hashCode 函数,可兼容绝大多数数据类型,但需注意该方法无法处理包含循环引用的对象。
补充说明: 函数实现中使用了 “|” 运算符,其目的是利用位运算将参数转换为 32 位整数,从而确保最终返回结果为标准的 32 位整数值。
此处展示的是使用 JavaScript 模拟 Java 字符串 hashCode() 方法的实现方案。
编写此函数的初衷是为了满足特定工作需求。显然,后端开发人员将 hashCode() 视为标准函数。该项目的难点不仅在于翻译 Java 中生成 hashCode() 的数学公式,更在于如何让 JavaScript 强制执行 32 位整数运算(这并非易事)。
幸运的是,JavaScript 支持位运算符,这些运算符天然限制在 32 位整数运算范围内。
以下是基于 JavaScript 字符串原型的实现方式。通过扩展该原型,您可以直接对任意字符串调用 .hashCode(),例如 “some string”.hashCode(),并将返回一个数字哈希值(具体而言,是与 Java 等效的哈希码),例如 1395333309。
其他实现变体
String.prototype.hashCode = function(){
var hash = 0;
if (this.length == 0) return hash;
for (i = 0; i < this.length; i++) {
char = this.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}以下是其他开发者提供的补充代码。
多种哈希算法对比
hashCode = function(str){
var hash = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
djb2Code = function(str){
var hash = 5381;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = ((hash << 5) + hash) + char; /* hash * 33 + c */
}
return hash;
}
sdbmCode = function(str){
var hash = 0;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = char + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
loseCode = function(str){
var hash = 0;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash += char;
}
return hash;
}以上就是关于 JavaScript hashCode 函数实现的详细总结,更多相关技术资料请持续关注本站后续文章。