给定相同的输入,HASHBYTES 函数是否保证返回相同的输出?

A.C*_*ham 6 sql-server t-sql

如果我在机器上的脚本中使用 SQL SERVER HASHBYTES() 函数,是否保证在另一台机器/实例上运行时产生相同的输出?

例如,将

SELECT HASHBYTES('SHA1', 'Hello World')

无论 SQL 版本、处理器架构等如何,生成相同的输出?

还会

SELECT HASHBYTES('SHA1', column1) from table1

如果列定义略有不同,则生成相同的输出 - 例如 varchar(50) 与 varchar(100)?

这里有什么需要考虑的吗?

Mar*_*son 7

对于不同的实例,HASHBYTES如果运行相同的脚本,则无论服务器版本、处理器或架构如何,都应该返回相同的值:

我刚刚在 SQL Server 2005 和 SQL Server 2012 上在完全不同的硬件配置上运行了以下内容。两者都产生了输出0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA

SELECT  HASHBYTES('SHA1', CAST('Test' AS VARCHAR(100)));
Run Code Online (Sandbox Code Playgroud)

但是,如果排序规则不同,则输出将不同。

在列定义方面,无论字段的长度如何,输出都应该相同。

以您的VARCHAR(50)and为例VARCHAR(100),我们可以像这样测试输出:

SELECT  HASHBYTES('SHA1', CAST('Test' AS VARCHAR(50))); 
SELECT  HASHBYTES('SHA1', CAST('Test' AS VARCHAR(100)));
Run Code Online (Sandbox Code Playgroud)

两个SELECT语句都返回相同的值:

0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA
Run Code Online (Sandbox Code Playgroud)

但是,请注意,即使使用相同的字符串,VARCHARandNVARCHAR也不会产生相同的HASHBYTES值:

SELECT  HASHBYTES('SHA1', CAST('Test' AS VARCHAR(50))); -- Returns 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA
SELECT  HASHBYTES('SHA1', CAST('Test' AS NVARCHAR(100))); -- Returns 0x9AB696A37604D665DC97134DBEE44CFE70451B1A 
Run Code Online (Sandbox Code Playgroud)