Mysql - обнаружение изменений в данных с помощью хэш-функции над частью таблицы - PullRequest
9 голосов
/ 23 июня 2010

Мне нужно сгенерировать один хэш для некоторых данных в таблице

CREATE TABLE Table1
(
       F1             INT          UNSIGNED NOT NULL AUTO_INCREMENT,
       F2              INT          default     NULL,
       F3               Varchar(50)  default     NULL,
      ..
       FN              INT          default     NULL,
       PRIMARY KEY (F1)
);

т.е. F1, F3, FN, где F2 = 10

SELECT md5(CONCAT_WS('#',F1,F3,FN)) FROM Tabe1 WHERE F2=10

Дает хэш для каждой строки втаблица.

ВОПРОСЫ

1) Как получить один хэш для всей таблицы?

2) Что такое алгоритм хэширования постов дляиспользовать MD5, SHA1, SHA или любой другой?

РЕДАКТИРОВАТЬ:

Mysql 4.1 используется - и он НЕ имеет поддержку триггера

Ответы [ 6 ]

10 голосов
/ 23 июня 2010

1)

SELECT MD5( GROUP_CONCAT( CONCAT_WS('#',F1,F3,FN) SEPARATOR '##' ) ) FROM Table1

2) Скорость на самом деле не имеет значения, поскольку функция должна запускаться только один раз, а все хэш-функции достаточно быстры

6 голосов
/ 25 июня 2010

Что касается скорости, вы должны попробовать.Это зависит от того, как реализованы функции.

Однако, есть вероятность, что вы увидите очень небольшую разницу в скорости.Все хеш-функции, которые вы цитируете, работают быстрее, чем может выдать средний диск, поэтому вопрос не в том, «какая хеш-функция сделает код быстрее всего?»но «какая хеш-функция сделает процессор максимально бездействующим, пока он ожидает данные с диска?».

На моем Intel Core2 Q6600 с тактовой частотой 2,4 ГГц (64-битный режим) и моим собственным CРеализация хеш-функций, я получаю следующие скорости хеширования:

  • MD5: 411 МБ / с
  • SHA-1: 336 МБ / с
  • SHA-256: 145 МБ / с
  • SHA-512: 185 МБ / с

Используется только одно ядро.Мои жесткие диски работают со скоростью около 100 МБ / с, поэтому можно сказать, что даже с SHA-256 процесс хеширования будет использовать не более 17% мощности процессора компьютера.Конечно, ничто не гарантирует, что реализация, используемая MySQL, будет такой быстрой, поэтому вам стоит попробовать.Кроме того, в 32-разрядном режиме производительность SHA-512 несколько снижается.

С криптографической точки зрения в MD5 и SHA-1 обнаружены (серьезные) недостатки, поэтому, если вы работаете в настройках безопасности(т.е. вы хотите обнаруживать изменения, даже если есть кто-то, кто может выбрать некоторые из изменений и предпочел бы, чтобы вы не обнаруживали эти изменения), вам следует придерживаться SHA-256 или SHA-512, которые, насколько нам известнодостаточно надежны.MD5 и SHA-1 по-прежнему хороши в ситуациях, не связанных с безопасностью.

3 голосов
/ 23 июня 2010

Я бы использовал MySQL Trigger для обнаружения изменений при вставке, удалении, обновлении и т. Д.

2 голосов
/ 25 августа 2014

Хотя эта тема старая, возможно, это то, что вам нужно: http://dev.mysql.com/doc/refman/5.0/en/checksum-table.html

1 голос
/ 04 ноября 2014

Если по какой-либо причине вы не можете использовать триггеры , другой подход заключается в использовании параметра CONCAT, например:

SELECT MD5( GROUP_CONCAT( CONCAT_WS('',F1,F3,FN) SEPARATOR ',' ) ) FROM Table1;

Но имейте в виду, что если в таблице есть выделениеданных запрос будет медленным!если возможно, попробуйте исключить ненужные столбцы из CONCACT.

Также обратите внимание, что по умолчанию MySQL Max CONCACT имеет значение 1024 , возможно, потребуется изменить это, выполнив сначала следующий запрос:

SET group_concact_max_len = 18446744073709547520;

Обратите внимание, что 18446744073709547520 - максимальное значение, вы можете использовать другое значение!

1 голос
/ 22 сентября 2014

См. BIT_XOR: http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html «Возвращает битовое XOR всех битов в выражении. Вычисление выполняется с точностью до 64 бит (BIGINT). Эта функция возвращает 0, если не было совпадающих строк». Для примера использования проверьте pt-table-sync.

...