DB2 BLOB 如何做 MD5?

Posted

技术标签:

【中文标题】DB2 BLOB 如何做 MD5?【英文标题】:How does DB2 BLOB do MD5? 【发布时间】:2019-10-16 08:26:11 【问题描述】:

当我使用 HASH 函数时,sysibm.hex (sysibm.hash (NAME, 0)) 是正常的,但如果 'NAME' 是 BLOB 或 CLOB,则不是。 我没有找到关于支持的答案。我的 MD5 用法有误吗?

Db2 11.5

VALUES HASH(BLOB('1',0)) --it's ok.
VALUES HEX(HASH(BLOB('1',0))) --it's wrong

我希望 blob 是 md5

【问题讨论】:

你的意思是当你运行 HEX(HASH(BLOB('1',0)) 时你得到 sqlcode -171 (SQL0171N) ? 是的,clob和blob不正常,其他都可以 试试HEX(CAST(HASH(BLOB('1'),0) as VARBINARY(128))) 我只想说,完美! 不幸的是,您必须为更大的 LOB 值编写自己的 Java / C 函数。但它们很简单...... 【参考方案1】:

HASH function 期望字符串表达式作为输入:

表示要散列的字符串值的表达式。此表达式必须返回内置字符串、图形字符串、二进制字符串、数值、布尔值或日期时间值。如果值不是字符、图形或二进制字符串,则在计算函数之前将其隐式转换为 VARCHAR。

因此涉及到一些隐式转换。我相信这可能是返回的 VARBINARY 的长度:

$ db2 "describe values hash('a',0)"

 Column Information

 Number of columns: 1

 SQL type              Type length  Column name                     Name length
 --------------------  -----------  ------------------------------  -----------
 908   VARBINARY                64  1                                         1

$ db2 "describe values hash(blob('a'),0)"

 Column Information

 Number of columns: 1

 SQL type              Type length  Column name                     Name length
 --------------------  -----------  ------------------------------  -----------
 908   VARBINARY             32672  1                                         1

HEX handles VARBINARY up to 16k:

最大长度为 16 336 字节。

所以这失败了:

db2 "values hex(hash(blob('a'),0))"
SQL0171N  The statement was not processed because the data type, length or 
value of the argument for the parameter in position "1" of routine 
"SYSIBM.HEX" is incorrect. Parameter name: "".  SQLSTATE=42815

但如果我们把它修剪下来,那就没问题了:

db2 "values hex(substr(hash(blob('a'),0),1,16) )"

1                               
--------------------------------
0CC175B9C0F1B6A831C399E269772661

  1 record(s) selected.

【讨论】:

【参考方案2】:

你可以试试这个:

HEX(CAST(HASH(BLOB('1'),0) as VARBINARY(128)))

【讨论】:

以上是关于DB2 BLOB 如何做 MD5?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob MD5算法

Azure Blob MD5算法

Azure Blob MD5算法

使用 Java 为 DB2 和 Oracle 插入 BLOB

从 DB2 和 Oracle 角度看 CLOB 和 BLOB 的区别?

数据库如何实现字段加密