JavaScript实现hashcode函数进行对象比较与原理说明

作者:半夏

时间:2026-10-30

浏览:255

本文介绍如何在JavaScript中实现类似Java的hashcode函数,用于比较两个对象的内容是否相等。通过JSON.stringify将对象转为字符串,利用字符编码计算哈希值,从而判断两个不同引用但内容相同的对象是否相等。

文章目录

在JavaScript中,数值的比较相对简单,使用相等(==)和全等(===)运算符通常可以处理大多数非对象类型的比较。然而,当涉及对象(object)比较时,这两个运算符往往无法满足所有需求。hashCode主要用于查找,而equals用于判断两个对象是否相等。

参考以下代码示例:

// 定义2个属性值完全相同的实例对象
var obj1 = {
    name: "neil",
    age: 100
};
var obj2 = {
    name: "neil",
    age: 100
};
var obj3 = obj2;
console.log(obj1 == obj2)   // false
console.log(obj2 == obj3)   // true
console.log(obj2 === obj3)   // true

从上述代码可以看出,对象obj1和obj2是不相等的,但obj2和obj3是相等的。这是因为在比较对象时,实际上比较的是对象的内存地址。只有当两个对象的引用指向同一个内存地址时,它们才被视为相等。

但在某些情况下,我们可能希望即使两个对象引用不同的内存地址,只要它们的内容完全相同,就判定这两个对象相等。为了实现这种字面意义上的相等判断,可以借鉴Java中的hashcode方法来实现:

// 定义hashcode函数
function hashcode(obj) {
    // 将对象obj转换为字符串
    var str = JSON.stringify(obj);
    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;
}

注意:计算过程使用的是字符串,因此需要先将参数obj转换为字符串。

通过上述方法,我们可以计算两个对象的hashcode,然后进行比较:

// 定义2个属性值完全相同的实例对象
var obj1 = {
    name: "neil",
    age: 100
};
var obj2 = {
    name: "neil",
    age: 100
};
// 定义hashcode函数
function hashcode(obj) {
    var str = JSON.stringify(obj);
    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;
}
console.log(hashcode(obj1)); // -311732675
console.log(hashcode(obj2)); // -311732675
console.log(obj1 == obj2); // false
console.log(hashcode(obj1) == hashcode(obj2)); // true

在上述代码中,对应obj1和obj2,hashcode方法都输出相同的值:-311732675。因此,在比较两个对象的hashcode值时,返回true。

JavaScript中获得HashCode值

直接使用以下三个方法即可:

function hashCode(strKey)
{
    var hash = 0;
    if(!isNull(strKey))
    {
        for (var i = 0; i < strKey.length; i++)
        {
            hash = hash * 31 + strKey.charCodeAt(i);
            hash = intValue(hash);
        }
    }
    return hash;
}
function isNull(str){
 return str == null || str.value == "";
 } 
function intValue(num)
{
    var MAX_VALUE = 0x7fffffff;
    var MIN_VALUE = -0x80000000;
    if(num > MAX_VALUE || num < MIN_VALUE)
    {
        return num &= 0xFFFFFFFF;
    }
    return num;
}

本站小编推荐一个不错的写法

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
};

到此这篇关于Javascript实现hashcode函数实现对象比较与原理说明的文章就介绍到这了,更多相关Javascript hashcode内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章