【发布时间】:2021-07-21 19:59:04
【问题描述】:
在给定时间,我存储了以下 ORACLE SQL 查询的结果:
SELET col , TO_CHAR( LOWER( STANDARD_HASH( col , 'MD5' ) ) AS hash_col FROM MyTable ;
一周后,我对相同的数据(列 col 的值相同)执行了相同的查询。
我认为生成的 hash_col 列的值与前一次执行的值相同,但事实并非如此。
ORACLE STANDARD_HASH 函数是否可以随着时间的推移为相同的输入数据提供相同的结果? 如果函数在同一天被调用两次,它会这样做。
【问题讨论】:
-
在没有
method参数的情况下调用standard_hash会计算 SHA1 哈希而不是 MD5 哈希。如果你传入相同的参数,你会得到相同的结果。这是哈希的一个非常基本的属性。我敢打赌,要么你没有执行相同的查询——也许之前你实际上计算了 MD5 哈希——或者数据实际上已经以某种方式发生了变化。 -
对。我更正了。如果哈希在同一天进行两次,但在不同的日子进行,它确实会给出相同的结果。看起来某些种子已更改,但 ORACLE STANDARD_HASH 函数中没有种子参数。
-
考虑数据的可能性,实际上并不相同。由不同字节组成的值在屏幕上显示时可能最终看起来相同。这可能以多种方式发生:字符串中的(不可见)空格、四舍五入的数值。
-
经过哈希处理的数据存储在两个哈希会话之间未修改的 ORACLE 表中。我对自己观察到的情况感到很困惑。
-
当你消除了不可能的事情后,剩下的无论多么不可能,都必须是事实。如果数据确实没有改变(您如何验证这一点?)并且散列没有从根本上错误地实现(Oracle 的其他用途会注意到),那么剩下的可能性很小,包括但不限于损坏的硬件。我的钱仍然是没有充分排除更改数据的可能性(可能通过非确定性查询)。尝试从您自己输入的值而不是表列中复制哈希值。