SQL方式获取整行的MD5或SHA1

标签 sql hash md5

是否有一种“半可移植”方法来获取整行的 md5() 或 sha1() ? (或者更好的是,按所有字段排序的整组行,即 order by 1,2,3,...,n)?不幸的是,并非所有数据库都是 PostgreSQL...我至少必须处理 Microsoft SQL Server、Sybase 和 Oracle。

理想情况下,我希望有一个聚合器(服务器端)并使用它来检测行组中的更改。例如,在具有某些时间戳列的表中,我想存储每个月的唯一签名。然后我可以快速检测自上次访问以来发生变化的月份(我将某些表镜像到运行 Greenplum 的服务器)并重新加载它们。

我研究了几个选项,例如tsql 中的 checksum(*) (可怕:它非常容易发生冲突,因为它基于一堆 XOR 和 32 位值)和 hashbytes('MD5', field),但后者不能应用于整行。这将为我提供一个针对我必须处理的 SQL 风格之一的解决方案。

有什么想法吗?即使只是上面提到的 SQL 惯用法之一,那就太好了。

最佳答案

您可以在更新触发器上计算整行的哈希字节值,我将其用作 ETL 过程的一部分,之前他们比较表中的所有列,速度提升巨大。

Hashbytes 适用于 varchar、nvarchar 或 varbinary 数据类型,我想比较整数键和文本字段,转换所有内容将是一场噩梦,因此我在 SQL Server 中使用了 FOR XML 子句,如下所示:

CREATE TRIGGER get_hash_value ON staging_table
FOR UPDATE, INSERT AS  
UPDATE staging_table
SET sha1_hash = (SELECT hashbytes('sha1', (SELECT col1, col2, col3 FOR XML RAW)))
GO

或者,如果您计划使用带有 for xml 子句的子查询对所有行进行多次更新,则可以在触发器之外以类似的方式计算值。如果走这条路线,您甚至可以将其更改为 SELECT *,但不能在触发器中更改,因为每次运行它时您都会得到不同的值,因为 sha1_hash 列每次都会不同。

您可以修改 select 语句以获取多于 1 行

关于SQL方式获取整行的MD5或SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452658/

相关文章:

perl - 在 Perl 中创建哈希

java - 在 Java 中生成 X509Certificate 的主题哈希

mysql - 在 MySQL 中将二进制字符串转换为 bigint?

数据库中的 SQL Server 对象

sql - 在执行 postgresql 函数时返回错误值的语法

mysql - COUNT() 是否运行两次?

python - 如何在Python中填写插入语句的列名

hash - 2个不同输入的哈希值可以相同吗?

java - Ant/checksum : How to generate one . md5 文件用于多个文件(导致 md5 文件包含多行)

android - 获取 Google API 的 MD5 签名