CNode

nodejs中的对象可以当作hash表来用吗?

问答
Jjoker0035发布于11 年前最后回复11 年前15 回复9332 浏览0 收藏

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

查看回复

回复 (15)

J
joker0035#1·11 年前

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

H
hinson0#2·11 年前

如果你只是想用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

A
alsotang#3·11 年前

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

A
albin3#4·11 年前

json跟hashtable不太一样…

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

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

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

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

Z
zsxsoft#5·11 年前
引用 albin3json跟hashtable不太一样… json是信息交换语言它只定义怎么用,没有规定具体怎么存储,怎么实现。。而具体的存储实现是在各JavaScript引擎那里的… hashtable是一种...

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

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

A
albin3#6·11 年前
引用 zsxsoft@albin3 v8里用的Map对象是std::map吧,如果是的话应该是红黑树或变种算法的。JavaScript的Map和Set对象在v8里好像用的是HashTable实现。 百万量级的话,...

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

Z
zsxsoft#9·11 年前
引用 albin3@zsxsoft 是objects.h里面的,Map这个类么。

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

J
joker0035#11·11 年前

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

J
joker0035#12·11 年前

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

J
joker0035#13·11 年前

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

W
weierbufan#14·11 年前

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"));

H
hezedu#15·11 年前

mark

参与回复
登录后即可参与回复。登录