无论服务器如何,HASHBYTES('SHA1',......)都会产生相同的结果吗?

时间:2018-02-15 09:11:53

标签: sql sql-server

我有一个包含文件和文件夹的数据库。路径可能很长,因此我无法将其编入索引。所以我想根据路径为每个文件夹生成一个更短的唯一键。我正在考虑使用下面的代码生成密钥:

HASHBYTES('SHA1', path)

这总是会产生相同的值,无论它执行什么服务器?它是一个天蓝色的数据库,因此服务器可以随时更改。

1 个答案:

答案 0 :(得分:1)

SHA-1是一个加密哈希函数,其输出完全取决于它的输入,因此对你的问题的简短回答是“是”。如果它在服务器之间有所不同,那就是一个错误。

但是,请注意<dl> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> <div> <dt>Column name</dt> <dd>Example value</dd> </div> </dl>哈希其输入的所有字节。您可能认为有很多字符串等于HASHBYTES没有。

HASHBYTES

这尤其重要,因为SQL Server的相等规则是不同的:SELECT HASHBYTES('SHA1', 'Hello') -- 0xF7FF9E8B7BB2E09B70935A5D785E0CC5D9D0ABF0 SELECT HASHBYTES('SHA1', 'HELLO') -- Case matters -- 0xC65F99F8C5376ADADDDC46D5CBCF5762F9E55EB7 SELECT HASHBYTES('SHA1', 'Hello ') -- Spaces matter -- 0x9646BA13A4E8EABECA4F5259BFD7DA41D368A1A6 SELECT HASHBYTES('SHA1', N'Hello') -- Unicode matters -- 0xD2EFCBBA102ED3339947E85F4141EB08926E40E9 SELECT HASHBYTES('SHA1', N'Hellο') -- Small letter omicron, not o -- 0x004BFE74DBA30800A3A4C271A9B0172B55C6E40E ,但就{T-SQL而言HASHBYTES(SHA1, 'Hello ') <> HASHBYTES(SHA1, 'Hello')而言。'Hello ' = 'Hello'。这是好事还是坏事取决于你的应用,但无论如何都需要考虑。要在不区分大小写,区分重音的字符串(如Windows路径)上构建哈希索引,您可以考虑使用HASHBYTES('SHA1', LTRIM(RTRIM(UPPER(path))))之类的内容来减少意外,并进行相应的比较。