hashbytes为int返回不同的值?

时间:2017-06-07 19:51:06

标签: sql-server sybase

在SQL Server上运行以下命令0xE864ECE8888043B67277C8B2CEFE96AD315FCCA4

select hashbytes('SHA1', cast(10 as varbinary(max)));

在Sybase上,以下SQL返回0xEB408DDC4FA484E6BEFDF5954E56A2198C7A9FAB

select hashbytes('SHA1', cast(10 as varbinary(8000))), hashbytes('SHA1', 10 ) 

为什么SHA1在不同的数据库上有不同的值?

2 个答案:

答案 0 :(得分:1)

在具有不同字节顺序的cpu上运行的MSSQL和Sybase可能存在问题。

考虑针对在Linux上运行的Sybase ASE进行以下运行(我在Solaris / x86上获得了与Sybase ASE相同的结果):

select hashbytes('SHA1', cast(10 as varbinary(8000))                  ),hashbytes('sha1',10                  )
select hashbytes('SHA1', cast(10 as varbinary(8000)),using         lsb),hashbytes('sha1',10,using         lsb)
select hashbytes('SHA1', cast(10 as varbinary(8000)),using         msb),hashbytes('sha1',10,using         msb)
select hashbytes('SHA1', cast(10 as varbinary(8000)),using unicode_lsb),hashbytes('sha1',10,using unicode_lsb)
select hashbytes('SHA1', cast(10 as varbinary(8000)),using unicode_msb),hashbytes('sha1',10,using unicode_msb)
go

 ------------------------------------------ ------------------------------------------
 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab

 ------------------------------------------ ------------------------------------------
 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab

 ------------------------------------------ ------------------------------------------
 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab 0xe864ece8888043b67277c8b2cefe96ad315fcca4

 ------------------------------------------ ------------------------------------------
 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab

 ------------------------------------------ ------------------------------------------
 0xeb408ddc4fa484e6befdf5954e56a2198c7a9fab 0xe864ece8888043b67277c8b2cefe96ad315fcca4

正如你所看到的,我得到了你提到的两个值; %CCA4匹配来自运行 hashbytes 使用msb 使用unicode_msb

您的Sybase版本是什么?

select @@version

答案 1 :(得分:1)

我无权访问Sybase的实例,但我会尝试猜测这种差异的主要原因是data type函数的第二个参数的HASHBYTES

[1]用于SQL Server的HASHBYTES

版本
  

@input指定包含要散列的数据的变量。 @input   是varchar,nvarchar或varbinary。

和[2]用于Sybase#s版本的HASHBYTES

  

expression [,expression ...]是要散列的值。这个值可以   是列名,变量,常量表达式或其组合   这些产生单一价值。它不能是图像,文本,unitext,   或者是行外的Java数据类型。

底线,为了在两个DBMS服务器上获得相同的结果,我将源值转换为相同的数据类型(例如[n] varchar(4000))。

`SELECT HASHBYTES('sha1', CONVERT(VARCHAR(12), 10)).

只有HASBYTES.SQL2016 +支持max数据类型。 SQL Server:在内部,varbinary(8000)和varbinary(max)是diff。数据类型