【问题标题】:Different Output with same Input for ORACLE MD5 FunctionORACLE MD5 函数的不同输出与相同输入
【发布时间】: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 的其他用途会注意到),那么剩下的可能性很小,包括但不限于损坏的硬件。我的钱仍然是没有充分排除更改数据的可能性(可能通过非确定性查询)。尝试从您自己输入的值而不是表列中复制哈希值。

标签: oracle hash md5


【解决方案1】:

关于数据改变(或不改变)和哈希改变(或不改变)的所有信息都是您的断言。

您可以创建和填充日志表:

create table hash_log (
   sample_time timestamp,
   hashed_string varchar2(200),
   hashed_string_dump varchar2(200),
   hash_value varchar2(200)
   );

然后每天:

insert into hash_log values 
  (select systimestamp,
          source_column,
          dump(source_column),
          STANDARD_HASH(source_column , 'MD5' )
   from source_table
   );

然后,发现变化:

select distinct      hashed_string ||
                     hashed_string_dump ||
                     hash_value 
from hash_log;

【讨论】:

  • 对。我不得不承认我自己对结果感到惊讶。我将设计您建议的实验(但源表和哈希日志表将相同)。可能我弄错了。稍后我会提供一些消息。谢谢。
  • 如何让源表和日志表一样?在我看来,两者之间存在一对多的关系。
  • 所以正如预期的那样,我今天对源表的列进行哈希处理得到了相同的结果。 TO_CHAR( LOWER( STANDARD_HASH( col , 'MD5' ) ) 在相同的数据上返回相同的结果。我以为我对相同的数据进行了哈希处理,但事实并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多