【问题标题】:How is input to the MySQL function md5 handled?如何处理 MySQL 函数 md5 的输入?
【发布时间】:2009-10-26 17:43:58
【问题描述】:

我在理解如何处理 MySQL 4.1.22 中 md5 函数的输入时遇到问题。基本上我无法重新创建特定值组合的 md5sum 进行比较。我想这与输入数据的格式有关。

我已经建立了一个表格,其中包含两列双精度(方向和高度)+第三列用于存储 md5 总和。

通过设置脚本,我将数据添加到方向和高度字段 + 使用以下语法创建校验和:

insert into polygons (
  direction, 
  elevation, 
  md5sum
) 
values ( 
  (select radians(20.0)), 
  (select radians(30.0)), 
  ( md5( (select radians(20.0)) + (select radians(20.0)) ) )
)

最后是:0.349065850398866, 0.523598775598299, '0c2cd2c2a9fe40305c4e3bd991812df5'

稍后我将存储的 md5sum 与新计算的值进行比较,新计算的值是使用 md5('0.349065850398866' + '0.523598775598299') 创建的,我得到以下校验和: '8c958bcf912664d6d27c50f1034bdf34'

如果我将传递的“字符串”中的最后一个小数从 9 修改为 8 0.523598775598298,我得到的校验和与之前存储的相同,'0c2cd2c2a9fe40305c4e3bd991812df5'。最后一位小数从 8 到 0 的任何值都给出相同的校验和。

在设置脚本中使用BINARY, (md5( (select BINARY(radians(20.0))) + (select BINARY(radians(20.0))) ) 创建与我原来的“运行时计算”相同的校验和

值得一提的是,原始方法适用于我拥有的所有其他行 (55)

我想我正在以一种有点奇怪的方式使用该功能,但我不确定更好的方式,所以为了找到更好的方式,我觉得我需要了解当前失败的原因。

【问题讨论】:

    标签: sql mysql md5


    【解决方案1】:

    您要相加的两个数字以二进制形式存储,但以十进制形式显示。如果您将十进制形式返回给机器,则无法保证您会得到完全相同的数字。

    在这种情况下,这会导致加法得到稍微不同的结果,从而得到完全不同的 MD5 和:

    mysql> select radians(20.0) + radians(30.0), '0.349065850398866' + '0.523598775598299';
    +-------------------------------+-------------------------------------------+
    | radians(20.0) + radians(30.0) | '0.349065850398866' + '0.523598775598299' |
    +-------------------------------+-------------------------------------------+
    |              0.87266462599716 |                          0.87266462599717 | 
    +-------------------------------+-------------------------------------------+
    1 row in set (0.00 sec)
    

    如果您想始终如一地获得相同的结果,您需要将radians(20.0)radians(30.0) 的结果存储在变量中的某个地方,永远不要依赖它们的打印表示。

    【讨论】:

    • 感谢您的精彩回答。我现在使用存储在方向和高度列中的数据直接在 mysql 中进行“运行时”计算,而无需往返于我的应用程序。
    【解决方案2】:

    弧度(20.0) 的输出计算的位数比打印输出中显示的多得多。当结果传递给 md5 函数时,将使用完整的非截断值,而打印的值将仅显示有限的位数。因此,在这两种情况下,传入 md5 函数的值并不相同。

    【讨论】:

    • 想通了。但我想如果我设法保持精度(假设列数据类型正确),则可以使用选择将方向和高度的值往返于应用程序,然后将其传递给新查询中的 md5 函数,并且从不贬低类型,还是我错了? “select radians(30.0)”返回什么数据类型,传递给md5函数(取字符串)时,它的精度如何影响
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2017-11-27
    • 1970-01-01
    • 2020-08-22
    • 2021-07-21
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多