nodejs中的对象可以当作hash表来用吗?
发布于 9 年前 作者 joker0035 8192 次浏览 最后一次编辑是 8 年前 来自 问答

最近项目中要用到hash表这种数据结构,在nodejs中的js对象看上去是和hash表类似的,但是其底层的实现是否能达到hash的效率则不了解,由于项目中的hash表存储的对象数量会达到百万级,因此在不了解node的底层实现的情况下所以没有去用node中的js对象而是用了redis来实现。 在此郑重请教诸位大牛,js的对象可以当hash表来用吗?如果不能有第三方类库可以实现这个功能吗?

15 回复

在ES6新标准中javascript提供专门的hash表类Hash,但目前的node貌似还不支持Hash类,其实这更让我怀疑js对象能否替代hash表,因为如果js中的对象可以很好替代hash表,ES6干嘛还要实现专门Hash类呢?

如果你只是想用hash这个数据结构,可以考虑es6新增加的数据结构map。拥有hash所有的接口


var map = new Map();
map.set('hello', 'world');
console.log(map.get('hello'));

// map.keys()
// map.has()
// map.values()

更多你可以参考

es6 map

我的代码: https://github.com/hinson0/task-board/blob/master/config/global.js

一般都是当 hash 用的。但是百万量级的话,就不知道效率如何了。

json跟hashtable不太一样…

json是信息交换语言它只定义怎么用,没有规定具体怎么存储,怎么实现。。而具体的存储实现是在各JavaScript引擎那里的…

hashtable是一种数据结构,json可以用hashtable,也可以用其他的…

看了一下V8的json-parser.h实现…里面根据不同的情况,会存在Map里或者不存在Map里…具体是什么条件还需要详细研究,不过相信一般的json比如纯的key-value形式,它肯定是存在Map里的。(这里的Map不是HashTable)

最后,影不影响性能还得看测试结果咯。

@albin3 v8里用的Map对象是std::map吧,如果是的话应该是红黑树或变种算法的。JavaScript的Map和Set对象在v8里好像用的是HashTable实现。

百万量级的话,不应该用Redis等KV数据库实现么,个人感觉一股脑全堆在Array还是Map里都是死。

@zsxsoft 里面用的是他自己实现的一个Map链接,Map的属性有字典模式和快速模式,不过具体是不是HashTable的实现就不知道了。确实这里的Map不应该跟HashTable混在一起,上面回答已修正。

@albin3 你说的“里面”指的是JSArray对象里面还是继承JSCollection的两个对象(JSSet / JSMap)里面?

@zsxsoftobjects.h里面的,Map这个类么。

@albin3 我错了_ (:з」∠)_ 之前看晕了一直没看到这个类,注意到其它.h里有#include <map>或者用了std::map就想当然了(我就想着只using了v8怎么会有这玩意的)

@zsxsoft 已follow… _ (:з」∠)_

map的话实现用的一般都是红黑树,搜索的复杂度是o(nlog2n),在性能上跟hash表的o(n)还是不能比的吧。

难道没有人在写nodejs的时候会想到要用hash表的吗?

打错字了,hash表搜索的复杂度应该是o(1)

nodejs里自己写的就是这个方式: var list = {}; list.add = function (key, value){ if (this.hasOwnProperty(key)){ } else{ this[key] = value; } }; list.get = function (key){ return this[key]; }; var arr = [1,2,3,4]; list.add(“lw”,arr); list.add(“we”,{ tx:‘buzhidao’, quan: 123 }); list.add(“lw”, “duhuo”); console.log(list.get(“lw”));

回到顶部