我希望有一种相对高效的方法来将整个表压缩成哈希值。
我有一些生成整个数据表的工具,可以用来生成更多的表,依此类推。我正在尝试实现一个简单的构建系统来协调构建运行并避免重复工作。我想记录输入表的哈希值,以便稍后检查它们是否发生了变化。构建表需要几分钟或几小时,因此花费几秒钟构建哈希是可以接受的。
我使用的一个技巧是将pg_dump的输出直接传输到md5sum中,但这需要将整个表转储通过网络传输到本地计算机上进行哈希处理。理想情况下,我希望在数据库服务器上生成哈希值。 在postgresql中找到行的哈希值为我提供了一种逐行计算哈希值的方法,然后可以以某种方式组合起来。
任何提示都将不胜感激。 编辑发布我最终得到的内容: tinychen的答案对我没有直接有效,因为我显然不能使用'plpgsql'。当我改用SQL实现函数时,它有效,但对于大型表来说非常低效。因此,我不再将所有行哈希连接起来,然后对其进行哈希,而是改为使用“滚动哈希”,其中先前的哈希与行的文本表示连接,然后对其进行哈希以生成下一个哈希。这样做效果更好;显然,在数百万次的短字符串上运行md5比连接数百万次的短字符串要好。
我有一些生成整个数据表的工具,可以用来生成更多的表,依此类推。我正在尝试实现一个简单的构建系统来协调构建运行并避免重复工作。我想记录输入表的哈希值,以便稍后检查它们是否发生了变化。构建表需要几分钟或几小时,因此花费几秒钟构建哈希是可以接受的。
我使用的一个技巧是将pg_dump的输出直接传输到md5sum中,但这需要将整个表转储通过网络传输到本地计算机上进行哈希处理。理想情况下,我希望在数据库服务器上生成哈希值。 在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(zz_hashagg(md5(CAST((example.*)AS text)))) from example
。 - subelsky