是否有哈希代码函数接受任何对象类型?
2022-08-30 02:04:31
基本上,我试图创建一个唯一对象的对象,一个集合。我有一个绝妙的想法,就是只使用一个JavaScript对象和对象作为属性名称。如
set[obj] = true;
这在某种程度上是有效的。它适用于字符串和数字,但对于其他对象,它们似乎都“散列”到相同的值并访问相同的属性。有没有办法为对象生成唯一的哈希值?字符串和数字如何做到这一点,我可以覆盖相同的行为吗?
基本上,我试图创建一个唯一对象的对象,一个集合。我有一个绝妙的想法,就是只使用一个JavaScript对象和对象作为属性名称。如
set[obj] = true;
这在某种程度上是有效的。它适用于字符串和数字,但对于其他对象,它们似乎都“散列”到相同的值并访问相同的属性。有没有办法为对象生成唯一的哈希值?字符串和数字如何做到这一点,我可以覆盖相同的行为吗?
如果你想要一个像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()
JavaScript 对象只能使用字符串作为键(其他任何内容都转换为字符串)。
或者,您可以维护一个数组,该数组为相关对象编制索引,并将其索引字符串用作对对象的引用。像这样:
var ObjectReference = [];
ObjectReference.push(obj);
set['ObjectReference.' + ObjectReference.indexOf(obj)] = true;
显然,这有点冗长,但你可以写几个方法来处理它,并得到和设置所有随意的。
编辑:
你的猜测是事实 - 这是在JavaScript中定义的行为 - 特别是发生toString转换意味着您可以在将用作属性名称的对象上定义自己的toString函数。- 奥利杰
这就引出了另一个有趣的观点;您可以在要散列的对象上定义 toString 方法,该方法可以形成其散列标识符。