在Javascript中存储带有哈希值的大列表的最佳方式

Best way to store a huge list with hashes in Javascript

本文关键字:列表 最佳 方式 哈希值 Javascript 存储      更新时间:2023-09-26

我有一个包含10,000个条目的列表。

例如

myList = {};
myList[hashjh5j4h5j4h5j4]
myList[hashs54s5d4s5d4sd]
myList[hash5as465d45ad4d]
....

我不使用数组(0,1,2,3),因为我可以检查非常快
->判断这个哈希是否存在

if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined')
{
  alert('it is new'); 
}
else
{
  alert('old stuff'); 
}

但我不确定,这是一个好的解决方案吗?
处理一个有10,000个条目的对象可能会有问题吗?

编辑:
我试图建立一个rss阅读器,只显示新的饲料。所以我计算一个哈希从链接(每个新闻有一个唯一的链接),并将其存储在对象(mongoDB)。顺便说一句:10,000个条目不是正常情况(但有可能)

我的建议:

  1. 为手头的任务使用尽可能小的散列。如果你正在处理数百个可哈希字符串,而不是数十亿个,那么你的哈希长度可以相对较小。
  2. 将哈希存储为整数,而不是字符串,以避免占用比需要的更少的空间。
  3. 不存储为对象,只是存储在一个简单的二叉树log2(keySize)深度

进一步的想法:

  1. 你可以用混合方法来解决这个问题吗?对不到一个月的最新提要使用散列,不要显示超过一个月的条目。将哈希和日期存储在一起,每天清除旧的哈希?

您可以使用in运算符:

if ('hashjh5j4h5j4h5j4' in myList) { .. }

然而,对于对象原型链中的成员,这也将返回true:

Object.prototype.foo = function () {};
if ("foo" in myList) { /* will be true */ };

要解决这个问题,您可以使用hasOwnProperty代替:

if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. }

虽然您自己可能没有向Object.prototype添加方法,但您不能保证您使用的其他第三方库没有;顺便说一句,扩展Object.prototype是不受欢迎的,所以你不应该这样做。为什么? ;因为你不应该修改不属于你的东西

10,000是相当多。您可以考虑将散列存储在数据库中,然后使用ajax进行查询。查询一个哈希值可能需要更长的时间,但你的页面加载速度要快得多。

无论如何,这在现代浏览器和现代计算机上都不是问题。

每个10k条目占用50字节,仍然占用不到500KB的ram。

只要js是压缩的,那么带宽就没有问题-但是要尽量晚一点提供数据,这样他们就不会阻碍页面加载性能。

总而言之,除非你想迎合手机,否则你的解决方案是好的。