首页 > 解决方案 > 是否可以获得 lokijs 数据库内容的散列(例如 SHA256 散列)?

问题描述

我正在构建一个应用程序,我需要在其中计算数据库上的加密哈希。我需要它是确定性的。也就是说,我将拥有不同的数据库实例,它们应该是相同的,并且应该产生相同的哈希值。相反,如果它们不相同,则散列不应该匹配。

我正在考虑将我的数据存储在 lokijs 中,但如果我这样做了,我不确定如何在不提取所有数据并在其上运行我的哈希算法的情况下计算哈希,这将是令人望而却步的。如果有一个“get hash”函数可以返回数据库内容的哈希值,那不是很酷吗?不要以为这样的事情存在,不是吗?

如果这不存在(并且我在文档中没有看到任何提及它,所以它可能不存在)然后我正在考虑在数据库前面添加一个“垫片”,我将在其中维护哈希数据库中的所有对象。例如:

function add (myObject, myCollection, myHashCollection) {
   hash = myObject.computeHash();
   myCollection.insert(myObject);
   myHashCollection.insert({key: myObject.someUniqueValue, value: hash});
}

以此类推,更新和删除的类似函数,给定一个对象,将在 myCollection 中更新或删除它,并在 myHashCollection 中更新或删除相应的哈希值。

然后我可以编写一个 getHash() 函数,它将 myHashCollection 中的哈希组合在一起并返回一个根哈希。

如果我有这个,我可以非常快速地比较来自我的应用程序不同实例的根哈希,以立即知道它们是否具有相同的数据。

此外,我可以确保持久/恢复中没有错误。我将保留对象数据并仅保留根哈希。从持久存储中恢复我的对象后,我将遍历所有数据并重新计算散列,将它们组合在一起,我应该得到与存储的根散列相同的值。如果没有,我知道出了点问题。类似的逻辑可以用来验证内存中存储的数据没有被破坏。

我还可以编写一个默克尔树算法,它可以非常有效地允许从数据库中检索到的任何特定对象与根哈希进行检查。

我疯了还是这听起来合理?

标签: lokijs

解决方案


推荐阅读