Как DB2 BLOB делает MD5? - PullRequest
       18

Как DB2 BLOB делает MD5?

0 голосов
/ 16 октября 2019

Когда я использую функцию 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

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вы можете попробовать это:

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

0 голосов
/ 16 октября 2019

Функция HASH ожидает строковое выражение в качестве входных данных:

Выражение, представляющее значение строки для хеширования. Это выражение должно возвращать встроенную символьную строку, графическую строку, двоичную строку, числовое значение, логическое значение или значение даты-времени. Если значение не является символьной, графической или двоичной строкой, оно неявно преобразуется в 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 обрабатывает VARBINARY до 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.
...