首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript中有没有某种哈希码函数?

在JavaScript中有没有某种哈希码函数?
EN

Stack Overflow用户
提问于 2008-10-11 23:45:38
回答 13查看 237.7K关注 0票数 164

基本上,我正在尝试创建一个包含唯一对象的对象,一个集合。我有一个绝妙的想法,那就是只使用一个JavaScript对象和属性名称的对象。比如,

代码语言:javascript
复制
set[obj] = true;

在一定程度上,这是可行的。它可以很好地处理字符串和数字,但对于其他对象,它们似乎都“散列”到相同的值并访问相同的属性。是否有某种方法可以为对象生成唯一的散列值?字符串和数字是如何做到这一点的,我可以覆盖相同的行为吗?

EN

回答 13

Stack Overflow用户

发布于 2011-11-10 16:01:45

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

代码语言:javascript
复制
String.prototype.hashCode = function(){
    var hash = 0;
    for (var i = 0; i < this.length; i++) {
        var character = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+character;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

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

请注意,hashCode可以是正的,也可以是负的,这是正常的,请参阅HashCode giving negative values。因此,您可以考虑将Math.abs()与此函数一起使用。

票数 67
EN

Stack Overflow用户

发布于 2009-05-20 02:52:00

要做到这一点,最简单的方法是为每个对象提供自己唯一的toString方法:

代码语言:javascript
复制
(function() {
    var id = 0;

    /*global MyObject */
    MyObject = function() {
        this.objectId = '<#MyObject:' + (id++) + '>';
        this.toString= function() {
            return this.objectId;
        };
    };
})();

我也遇到过同样的问题,这对我来说完美地解决了这个问题,而且比重新实现一些胖的Java风格的Hashtable并将equals()hashCode()添加到对象类要容易得多。只要确保你没有把一个字符串'<#MyObject:12>‘放入你的散列中,否则它会用这个id清除你正在退出的对象的入口。

现在我所有的哈希都很酷了。几天前我还发布了一篇关于this exact topic的博客文章。

票数 30
EN

Stack Overflow用户

发布于 2011-11-10 17:31:39

ECMAScript 6规范(JavaScript的下一版本)的一部分Harmony WeakMaps已经涵盖了您所描述的内容。也就是说:一个集合,其中的键可以是任何东西(包括未定义的),并且是不可枚举的。

这意味着除非直接引用键(任何对象),否则不可能获得对值的引用。与之相关的链接。它对于与效率和垃圾收集相关的一系列引擎实现原因很重要,但它也非常酷,因为它允许新的语义,如可撤销的访问权限和在不暴露数据发送者的情况下传递数据。

来自MDN

代码语言:javascript
复制
var wm1 = new WeakMap(),
    wm2 = new WeakMap();
var o1 = {},
    o2 = function(){},
    o3 = window;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // A value can be anything, including an object or a function.
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // Keys and values can be any objects. Even WeakMaps!

wm1.get(o2); // "azerty"
wm2.get(o2); // Undefined, because there is no value for o2 on wm2.
wm2.get(o3); // Undefined, because that is the set value.

wm1.has(o2); // True
wm2.has(o2); // False
wm2.has(o3); // True (even if the value itself is 'undefined').

wm1.has(o1);   // True
wm1.delete(o1);
wm1.has(o1);   // False

WeakMaps可以在当前的火狐,浏览器和边缘浏览器中使用。在Node v7和v6中使用--harmony-weak-maps标志也支持它们。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/194846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档