微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在postgresql中获取整个表的哈希值?

我想要一个相当有效的方法来将整个表格集中到哈希值.

我有一些工具可以生成整个数据表,然后可以用它来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我想要能够记录输入表的哈希值,以便稍后检查它们是否已更改.建立桌子需要几分钟或几个小时,所以花费几秒钟的建筑散热是可以接受的.

我使用的一个黑客是将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

原文地址:https://www.jb51.cc/postgresql/192710.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐