Hashbytes Computed列无法持久化,因为该列具有不确定性

本文关键字:因为 不确定性 持久化 Computed Hashbytes | 更新日期: 2023-09-27 18:00:12

我正在尝试使用HashBytesdatetime列进行哈希

alter table dbo.Events 
add HashKey AS hashbytes('MD5', cast(convert(varchar(200), format(datestamp,'yyyy-MM-dd HH:mm:ss.ffffff')) as  varbinary)) persisted

但由于它是不确定的,我得到了这个错误:

无法持久化计算列,因为该列不具有确定性。

我设法完成了它,没有指定格式如下

alter table dbo.PolicyEventsFromQueue 
add HashKey AS hashbytes('MD5', cast( datestamp as  varbinary)) persisted

但在SQL Server中,当我看到有格式和没有格式的结果时,我会得到相同字段值的不同结果:

Select 
    convert(varchar(200), hashbytes('MD5', cast(convert(varchar(200), format(datestamp, 'yyyy-MM-dd HH:mm:ss.ffffff')) as varbinary)), 1)  
From 
    Events
Where 
    DateStamp ='2016-06-30 12:19:35.257961'

结果:

0xBE06A33FF10644A6D3B38EA134DDB97A

第二个查询:

select 
    hashbytes('MD5', cast('2016-06-30 12:19:35.257961' as varbinary))

结果:

0xBE06A33FF10644A6D3B38EA134DDB97A

第三个查询:

Select 
    convert(varchar(200), hashbytes('MD5', cast(DateStamp as varbinary)), 1)  
From 
    Events 
Where 
    DateStamp = '2016-06-30 12:19:35.257961'

结果:

0x3CB5C26B23EB4422515764686DFCAB82

基于以上研究,我所理解的是SQL Server正在将日期戳转换为另一种格式,然后进行哈希处理。

但是,当我使用下面的函数获得相同日期的C#等价值("2016-06-30 12:19:35.257961")时,它与哈希值(0x3CB5C26B23EB4422515764686DFCAB82)不匹配。

public static byte[] GetMD5Hash(string input)
{
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.Unicode.GetBytes(input);
        bs = x.ComputeHash(bs);
        return bs;
}

任何人都能像在SQL Server和C#中一样匹配日期-时间格式,使其与HashBytes一起工作吗。

注:我需要所有日期,包括毫秒。这个问题是下面问题的后续问题。它可能有助于您理解根本问题。

下面的SQL HashBytes函数需要C#等价物

Hashbytes Computed列无法持久化,因为该列具有不确定性

我得到了解决方案。我修改了HashBytes逻辑如下,以获得所需的日期时间格式,而且在C#方面,我使用默认编码。

Select hashbytes('MD5', convert(varchar(200),(CONVERT(varchar(10),datestamp,126)+' '+CONVERT(VARCHAR(24),datestamp,114)),2))
from Events
Where DateStamp ='2016-06-30 12:19:35.257961'
相关文章: