最近项目中要用到hash表这种数据结构,在nodejs中的js对象看上去是和hash表类似的,但是其底层的实现是否能达到hash的效率则不了解,由于项目中的hash表存储的对象数量会达到百万级,因此在不了解node的底层实现的情况下所以没有去用node中的js对象而是用了redis来实现。 在此郑重请教诸位大牛,js的对象可以当hash表来用吗?如果不能有第三方类库可以实现这个功能吗?
在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()
更多你可以参考
我的代码: 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里都是死。
@albin3 你说的“里面”指的是JSArray
对象里面还是继承JSCollection
的两个对象(JSSet
/ JSMap
)里面?
@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”));
mark