首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure数据流md5函数不能将十进制值识别为唯一

问Azure数据流md5函数不能将十进制值识别为唯一
EN

Stack Overflow用户
提问于 2020-10-28 23:00:14
回答 1查看 205关注 0票数 2

我们使用Azure数据流在Azure SQL数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用md5或sha1函数来生成唯一的行指纹,以检测记录中的更改,或识别已删除/新的记录(相当标准的历史记录技术)。

对于某些数据表,我们有包含十进制值的列(例如,数据类型DECIMAL(18,1) )。如果我看一下在一个整数,一个文本和一个十进制列上生成的md5散列,我会期望这三行在Azure数据流中生成不同的散列:

​

但是,这三行得到的散列完全相同,这意味着我们无法检测到id = 1的记录的字段值的变化。如果十进制值在数据库中存储为文本(或在md5函数中转换为字符串),则散列是不同的:

​

​

这导致我们的一些历史表不能保持数据的准确记录,只有小数列中的值发生了变化。

我的问题是:有没有人知道这是Azure数据流的“设计”,还是这是一个需要微软修复的bug?

EN

回答 1

Stack Overflow用户

发布于 2020-12-23 21:43:32

是的,这是设计出来的,同时也是一个bug。

我也面临着这个问题,我和团队想出了和你一样的变通方法,但执行时间翻了一番。

在对微软进行了大约一个小时的讨论后,我们发现:

指定精度和小数位数的浮点数不受affected

  • datatypes的影响,最后一个行为是,向上舍入

  • md5并对其应用md5。

对于这些值,MD5将返回相同的值:

  • 0.1
  • 0.4

下面的值具有相同的行为:

  • 0.5
  • 0.6
  • 1

对于以下内容,将返回不同的哈希:

  • 0.4
  • 0.9
  • 1.5
  • 2.5

有人告诉我,预计2月份会有修复。

如果不使用像me (byNames)这样的列函数,您可以将值乘以以10为底的幂,并将小数作为指数。

这将比toString更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64575556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档