我有一个包含文件和文件夹的数据库。路径可能很长,因此我无法将其编入索引。所以我想根据路径为每个文件夹生成一个更短的唯一键。我正在考虑使用下面的代码生成密钥:
HASHBYTES('SHA1', path)
这总是会产生相同的值,无论它执行什么服务器?它是一个天蓝色的数据库,因此服务器可以随时更改。
答案 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))))
之类的内容来减少意外,并进行相应的比较。