Я бы хотел довольно эффективный способ сконденсировать всю таблицу на значение хеша.
У меня есть инструменты, которые генерируют целые таблицы данных, которые затем могут использоваться для создания дополнительных таблиц и т.д. Я пытаюсь реализовать упрощенную систему сборки для координации прогонов сборки и избежания повторной работы. Я хочу иметь возможность записывать хэши входных таблиц, чтобы потом проверить, изменились ли они. Построение таблицы занимает несколько минут или часов, поэтому приемлемо тратить несколько секунд на хеширование.
Хак, который я использовал, - это просто передать вывод pg_dump в md5sum, но для этого требуется перенос всего дампа таблицы по сети на хэш в локальном поле. В идеале я хотел бы создать хэш на сервере базы данных.
Нахождение хэш-значения строки в postgresql дает мне способ вычисления хеша для строки за раз, которая затем может быть скомбинирована.
Приветствуются любые советы.
Редактировать сообщение, в котором я закончил: ответ tinychen не работал у меня напрямую, потому что я не мог использовать "plpgsql", по-видимому. Когда я реализовал функцию в SQL вместо этого, она работала, но была очень неэффективной для больших таблиц. Поэтому вместо объединения всех хешей строк и последующего хэширования я переключился на "катящийся хеш", где предыдущий хэш объединяется с текстовым представлением строки, а затем хэшируется для создания следующего хэша. Это было намного лучше; по-видимому, работает md5 на коротких строках миллионы лишних раз лучше, чем конкатенация коротких строк в миллионы раз.
create function zz_concat(text, text) returns text as
'select md5($1 || $2);' language 'sql';
create aggregate zz_hashagg(text) (
sfunc = zz_concat,
stype = text,
initcond = '');