Как посчитать контрольную сумму бд?

248
26 ноября 2016, 20:12

Есть приложение под андройд, которое использует SQLite бд. И есть сервер на java, работающий с MySQL. Необходимо узнать одинаковые ли в этих двух базах данные. Решил использовать конрольные суммы для этого. Как реализвать это средствами Java?

Answer 1

Ответ очень высокоуровневый, потому что задача довольно обширная.

Это плохая идея, но уж если делать...

Встроенных механизмов в самих БД для этого нет.

Поскольку контрольные суммы обычно определяются для последовательностей байт, ваша задача получить одинаковые последовательности байт из одинаковых байт на разных БД. Каждая такая последовательность должна уникально идентифицировать текущее состояние данных.

А хэширование (снятие контрольной суммы) в этом контексте будет лишь своеобразным алгоритмом сжатия (с потерями) этой последовательности. Поскольку есть потери, он будет не в состоянии доказать идентичность данных из-за ненулевой (хоть и очень небольшой) вероятности коллизий.

В Java есть класс MessageDigest. Можно инициализировать его объект и кормить его методу update отдельные небольшие массивы байт данных, кусочки описанной выше последовательности, получая их по кусочкам (курсором или иным образом) из базы, чтобы не хранить в памяти целиком.

Сам алгоритм получения уникальной последовательности это целое поле для творчества, поэтому готовый код приводить не буду. Но на этом поле есть некоторые мины и грабли, о которых считаю нужным упомянуть:

  • Упорядочивайте данные по первичному ключу. БД, скорее всего, и так это сделает, но лучше сделать это явно и обезопасить себя от внезапных багов.
  • Проверьте, что кодировки данных совпадают.
  • Нужно аккуратно показывать в массиве байт границы отдельных полей, записей и таблиц, чтобы не получилось так, чтобы похожие, но разные наборы данных представились одинаковыми массивами.
    • Такое запросто может быть, если, скажем, просто дампать значение за значением подряд (фактически конкатенируя их). Это может неплохо работать на практике, но может сломаться в самый неподходящий момент.
  • Не используйте "резиновые" форматы вроде JSON, для которых разные реализации маршаллеров на одинаковых данных могут выдавать разные вещи. Или хотя бы используйте одинаковые предсказуемые реализации.

...а может статься, разумнее воспользоваться другим хранилищем данных. Например, каким-нибудь, в котором изначально предусмотрена раздельная работа отдельных БД и синхронизация "когда-нибудь потом". Ведь с высокой вероятностью вас интересует не только проверка на идентичность данных, но и приведение их в идентичный вид.

Например, есть совместимые (на большой процент) между собой CouchBase для Android, CouchDB для сервера и PouchDB для браузера. Но если поискать, могут найтись какие-нибудь ещё.

READ ALSO
Выбрать все не NULL значения mysql

Выбрать все не NULL значения mysql

Есть таблица, где поля с атрибутами, у некоторых есть значение, у некоторых нет - NULL

296
Как лучше организовать базу данных для андроид приложения

Как лучше организовать базу данных для андроид приложения

Какую базу данных лучше использовать для GPS TrackerаХранить данные о местонахождении и обмениваться ими между зарегистрированными пользователями

303
Как сделать вывод с ограничением в OpenCart?

Как сделать вывод с ограничением в OpenCart?

Добрый день!Работаю с OpenCart, и не знаю как воплотить свою идеюУ нас есть 2 поля в админке, куда мы вводим слова:

233