gpt4 book ai didi

sql-server - 为什么这些 Datetime 值返回相同的 Checksum & Checksum_Agg?我怎样才能让它更独特?

转载 作者:行者123 更新时间:2023-12-04 05:14:35 24 4
gpt4 key购买 nike

我试图快速确定两组时间表是否相同,并生成一个 key ,这些独特的时间表可以作为引用。我最初尝试使用 HASHBYTES,但很快发现您只能对 8000 个字符进行哈希处理,而且我有大量的日期时间,这些时间在连接时长于 8000。

所以,我尝试使用 Checksum 和 Checksum_Agg,因为它们似乎是为这类事情设计的。我知道校验和生成非唯一值的可能性更高。但是我需要将这些进行相互比较的范围/上下文是如此狭窄,我认为我可以逃脱它。

不幸的是,经过一些测试后,我了解到我可以在仅 4 行日期时间数据中找到校验和“冲突”!我觉得这有点奇怪,并发现了碰撞的模式。

下面是一个演示问题的示例脚本:

声明@Rows 表
(
[GroupId] INT,
[开始日期] 日期时间,
[结束日期] 日期时间
)

--Group1
插入 @Rows 值 (1, '2013-01-20 01:00:00.000', '2013-01-20 01:20:00.000')
插入@Rows 值 (1, '2013-01-20 01:20:00.000', '2013-01-20 01:40:00.000')
--INSERT INTO @Rows 值 (1, '2013-01-20 01:40:00.000', '2013-01-20 02:00:00.000')
--INSERT INTO @Rows 值 (1, '2013-01-20 02:00:00.000', '2013-01-20 02:20:00.000')
--INSERT INTO @Rows 值 (1, '2013-01-20 02:20:00.000', '2013-01-20 02:40:00.000')
--INSERT INTO @Rows 值 (1, '2013-01-20 02:40:00.000', '2013-01-20 03:00:00.000')

--Group2
插入@Rows 值 (2, '2013-01-21 01:00:00.000', '2013-01-21 01:20:00.000')
插入 @Rows 值 (2, '2013-01-21 01:20:00.000', '2013-01-21 01:40:00.000')
--INSERT INTO @Rows 值 (2, '2013-01-21 01:40:00.000', '2013-01-21 02:00:00.000')
--INSERT INTO @Rows 值 (2, '2013-01-21 02:00:00.000', '2013-01-21 02:20:00.000')
--INSERT INTO @Rows 值 (2, '2013-01-21 02:20:00.000', '2013-01-21 02:40:00.000')
--INSERT INTO @Rows 值 (2, '2013-01-21 02:40:00.000', '2013-01-21 03:00:00.000')

SELECT [ChecksumAgg1] = CHECKSUM_AGG([CheckSum])
发件人
(
SELECT [CheckSum] = CHECKSUM([StartDate], [EndDate])
从@Rows
哪里 GroupId = 1
) G1

SELECT [ChecksumAgg2] = CHECKSUM_AGG([CheckSum])
发件人
(
SELECT [CheckSum] = CHECKSUM([StartDate], [EndDate])
从@Rows
哪里 GroupId = 2
) G2

结果是:

ChecksumAgg1: 5681728

ChecksumAgg2: 5681728

这两个系列日期之间的唯一区别是它们相隔 1 天。但它们生成相同的校验和!但仅当存在 时偶数行。如果您取消注释来自组 1 的插入和来自组 2 的插入,您将获得两个不同的校验和。但是然后取消评论另一对,您将获得另一场比赛!

最后我有两个问题。我很想更多地了解它是如何工作的,以及为什么这种模式似乎会影响一个非常可预测的校验和值。更重要的是,我想知道是否有更好的方法来从本质上创建一个非常大的数据集的“指纹”。我知道我不能保证这个哈希是全局唯一的,但我显然需要比校验和更好的东西。

我能够对校验和计算进行某种技巧的一种方法是在日期时间上执行 HASHBYTES,然后将其提供给校验和函数。通过这种方式,校验和被馈送的值比具有相似外观差异的一组日期更加随机。但这就足够了吗?

编辑 - 这里只是更多的上下文。

基本上我有一个系统,它有大量的时间表数据和一个单独的系统,它在特定时间对这些时间表感兴趣。例如,多个用户可能会看到这个复杂时间表部分的特定版本,并希望添加一些元数据(可能是他们的批准状态、注释或其他内容)。如果某些外部来源对任何单个日期时间进行了更改,则需要断开此链接,因为它不再是相同的时间表!

有许多不同的系统可以对核心计划数据进行更改,这就是为什么我很难将这种关注提升到代码级别,以某种方式管理并将其“规范化”为以某种方式表示每个快照的实体。我将不得不在 100 万个地方使用 Hook 来监听更改,然后清理指向日程表的任何内容。

最佳答案

来自此页面的评论:

http://msdn.microsoft.com/en-us/library/ms188920.aspx

Checksum_Agg 似乎是使用 XOR 构建的。关于 XOR 的事情是,通过两次包含相同的数字,它们往往很容易可逆。这解释了为什么您只在偶数时才注意到它。

只要您知道 XOR 问题并以混合所有位的方式预先加扰您提供给它的内容,您就应该没问题。

关于sql-server - 为什么这些 Datetime 值返回相同的 Checksum & Checksum_Agg?我怎样才能让它更独特?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com