我想要一个相当有效的方法来将整个表格集中到哈希值.
我有一些工具可以生成整个数据表,然后可以用它来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我想要能够记录输入表的哈希值,以便稍后检查它们是否已更改.建立桌子需要几分钟或几个小时,所以花费几秒钟的建筑散热是可以接受的.
我使用的一个黑客是将pg_dump的输出管道传输到md5sum,但是这需要通过网络传输整个表转储,以便在本地框上进行散列.理想情况下,我想在数据库服务器上生成哈希值.
Finding the hash value of a row in 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 = '');
只是这样做来创建哈希表聚合函数.
create function pg_concat( text,text ) returns text as ' begin if $1 isnull then return $2; else return $1 || $2; end if; end;' language 'plpgsql'; create function pg_concat_fin(text) returns text as ' begin return $1; end;' language 'plpgsql'; create aggregate pg_concat ( basetype = text,sfunc = pg_concat,finalfunc = pg_concat_fin);
那么您可以使用pg_concat函数来计算表的哈希值.
select md5(pg_concat(md5(CAST((f.*)AS text)))) from f order by id