加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:28:46 所属栏目:百科 来源:网络整理
导读:我想要一个相当有效的方法来将整个表格集中到哈希值. 我有一些工具可以生成整个数据表,然后可以用它来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我想要能够记录输入表的哈希值,以便稍后检查它们是否已更改.建立桌子需要
我想要一个相当有效的方法来将整个表格集中到哈希值.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读