我正在构建一个应用程序,需要在其中计算数据库上的加密哈希。我需要它具有确定性。也就是说,我将拥有数据库的不同实例,这些实例应该是相同的,并且应该导致相同的哈希值。相反,如果它们不相同,则哈希值不应该匹配。
我正在考虑将数据存储在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中的哈希值汇总在一起并返回一个根哈希值。
如果有了这个,我可以非常快速地比较应用程序不同实例中的根哈希,以立即知道它们是否具有相同的数据。
此外,我可以确保持久性/恢复中没有错误。我将保留对象数据并仅保留根哈希。从持久性存储中还原对象后,我将遍历所有数据并重新计算哈希,将它们凑在一起,并且我应该获得与存储的根哈希相同的值。如果没有,我知道出了点问题。类似的逻辑可以用来验证内存中存储的数据没有被破坏。
我还可以编写一个merkle树算法,该算法将非常有效地允许针对根哈希对从数据库中检索到的任何特定对象进行检查。
我疯了还是听起来合理?