HASHBYTES计算列不能持久,因为该列是不确定性(Hashbytes Computed colu

2019-09-26 08:50发布

我想散列datetime使用列HashBytes

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年6月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

注:我需要的所有更新,包括miiliseconds。 这个问题是后续到下面的问题。 它可以帮助你了解问题的根源。

需要C#等同于下面的SQL HASHBYTES功能

Answer 1:

我得到了解决。 我修改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'


文章来源: Hashbytes Computed column cannot be persisted because the column is non-deterministic