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

标签 sql postgresql hash

我想要一种相当有效的方法来将整个表压缩为哈希值。

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

我使用的一个 hack 是将 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 = '');

最佳答案

我知道这是个老问题,但这是我的解决方案:

SELECT        
    md5(CAST((array_agg(f.* order by id))AS text)) /* id is a primary key of table (to avoid random sorting) */
FROM
    foo f; 

关于sql - 如何在 postgresql 中获取整个表的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020033/

相关文章:

Postgresql 多数据库 VS 多模式

postgresql - PL/pgSQL - %TYPE 和 ARRAY

javascript - Jquery .hash 不适用于 Bootstrap 选项卡

algorithm - 有了哈希和密码,我可以重新创建算法吗?

mysql - 如何在 MySQL 中使用 CASE?

mysql - 使用 GREATEST() 方法选择第二大

sql - 带有 THEN 1 THEN 0 ELSE 0 的 PostgreSQL SUM CASE 表达式

sql - 如何使用触发器 Postgres 打印新值

postgresql - Postgres 12 - 如何减小 wal 目录的大小

python - 为什么这个 python 类实例是可哈希的?