是否有哈希代码函数接受任何对象类型?

2022-08-30 02:04:31

基本上,我试图创建一个唯一对象的对象,一个集合。我有一个绝妙的想法,就是只使用一个JavaScript对象和对象作为属性名称。如

set[obj] = true;

这在某种程度上是有效的。它适用于字符串和数字,但对于其他对象,它们似乎都“散列”到相同的值并访问相同的属性。有没有办法为对象生成唯一的哈希值?字符串和数字如何做到这一点,我可以覆盖相同的行为吗?


答案 1

如果你想要一个像JavaScript中的Java一样的hashCode()函数,那就是你的:

function hashCode(string){
    var hash = 0;
    for (var i = 0; i < string.length; i++) {
        var code = string.charCodeAt(i);
        hash = ((hash<<5)-hash)+code;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

这就是Java(按位运算符)中的实现方式。

请注意,哈希码可以是正数和负数,这是正常的,请参阅哈希码给出负值。因此,您可以考虑与此功能一起使用。Math.abs()


答案 2

JavaScript 对象只能使用字符串作为键(其他任何内容都转换为字符串)。

或者,您可以维护一个数组,该数组为相关对象编制索引,并将其索引字符串用作对对象的引用。像这样:

var ObjectReference = [];
ObjectReference.push(obj);

set['ObjectReference.' + ObjectReference.indexOf(obj)] = true;

显然,这有点冗长,但你可以写几个方法来处理它,并得到和设置所有随意的。

编辑:

你的猜测是事实 - 这是在JavaScript中定义的行为 - 特别是发生toString转换意味着您可以在将用作属性名称的对象上定义自己的toString函数。- 奥利杰

这就引出了另一个有趣的观点;您可以在要散列的对象上定义 toString 方法,该方法可以形成其散列标识符。