Я создаю приложение, в котором мне нужно вычислить криптографический хэш в базе данных. Мне нужно, чтобы это было детерминированным. То есть у меня будут разные экземпляры базы данных, которые должны быть идентичными и которые должны приводить к одинаковым хэшам. И наоборот, если они не идентичны, хэши не должны совпадать.
Я рассматриваю возможность хранения своих данных в 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 и возвращала корневой хеш.
Если бы у меня было это, я мог бы очень быстро сравнить корневые хеши из разных экземпляров моего приложения, чтобы сразу узнать, имеют ли они одинаковые данные.
Кроме того, я не мог убедиться в отсутствии ошибок при сохранении / восстановлении. Я бы сохранил данные объекта и сохранил только корневой хэш. Восстановив свои объекты из постоянного хранилища, я перебрал бы ВСЕ данные и пересчитал хэши, объединил их вместе, и я должен получить то же значение, что и сохраненный корневой хэш. Если нет, я знаю, что что-то пошло не так. Аналогичная логика может использоваться для проверки того, что сохраненные в памяти данные не были повреждены.
Я также мог бы написать алгоритм дерева меркла, который бы очень эффективно позволял проверять любой конкретный объект, извлеченный из базы данных, по корневому хешу.
Я сумасшедший или это звучит разумно?