如何在Postgres中生成结果集的哈希值?

时间:2010-08-20 17:25:15

标签: postgresql hash checksum

我有两个用于记录内容的数据库,我想检查它们是否同步。

批准的解决方案是定期发送(比如说每小时)一个select到两者,生成结果集的哈希并比较它们。如果它们匹配那么好,否则会产生一些警报。

目前我正在通过(bash脚本)来实现它:

 log_table="SELECT column1, column2, column3 FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'";
PSQL="psql -t -q -h $_gp_host -U $_gp_user -d log_schema -c ";
echo "`${PSQL} $tx_fix${log_table} | sort | cksum`";

我想在postgres方面做cksum / hash。因为它目前下载整个结果集(甚至可以有25MB或更多)并在服务器端生成校验和。

谷歌没有帮助。

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用md5:

 log_table="
SELECT 
  md5(column1 || column2 || column3) AS hash,
  column1, column2, column3
FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'";

答案 1 :(得分:1)

如果你想一次对所有这些进行哈希处理,那么它也将耗尽很多内存服务器端。一旦你达到1Gb,它将不再起作用,因为单个字符串不能超过那个。

也许这样的东西会起作用,它基本上会对每一行进行哈希处理,然后对这些哈希进行哈希处理。当哈希的长度超过1Gb时,它仍然会破裂 - 你需要编写一个自定义的md5聚合来绕过它。

SELECT md5(concat(md5(column1 || column2 || column3))) FROM log_table WHERE ...

这要求您创建了自定义聚合concat,如下所示:

CREATE AGGREGATE concat (
    BASETYPE = text,
    SFUNC = textcat,
    STYPE = text,
    INITCOND = ''
);