在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在不同的数据库上有不同的值?
答案 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。数据类型