我有一些工具可以生成整个数据表,然后可以用它来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我想要能够记录输入表的哈希值,以便稍后检查它们是否已更改.建立桌子需要几分钟或几个小时,所以花费几秒钟的建筑散热是可以接受的.
我使用的一个黑客是将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( || );' language 'sql';create aggregate zz_hashagg(text) ( sfunc = zz_concat,stype = text,initcond = '');只是这样做来创建哈希表聚合函数.
create function pg_concat( text,text ) returns text as 'begin if isnull then return ; else return || ; end if;end;' language 'plpgsql';create function pg_concat_fin(text) returns text as 'begin return ;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总结
以上是内存溢出为你收集整理的如何在postgresql中获取整个表的哈希值?全部内容,希望文章能够帮你解决如何在postgresql中获取整个表的哈希值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)