我想要一种相当有效的方法来将整个表压缩为哈希值。
我有一些工具可以生成整个数据表,然后可以用来生成更多的表,等等。我正在尝试实现一个简单的构建系统来协调构建运行并避免重复工作。我希望能够记录输入表的哈希值,以便稍后检查它们是否已更改。构建表需要几分钟或几小时,因此花几秒钟构建哈希是可以接受的。
我使用的一个 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/