存储过程(不)返回散列字符串

时间:2010-10-16 15:46:16

标签: sql-server tsql stored-procedures hash sha1

我正在尝试编写一个存储过程,它将获取一个字符串,用SHA1散列它然后返回散列。我似乎无法让它返回@hashedString。我承认我是T-SQL的初学者。

我正在db中直接编写T-SQL。

这就是我现在所要做的:

ALTER PROCEDURE dbo.ConvertToHash

 (
 @stringToHash nvarchar(256),
 @hashedString nvarchar(256) OUTPUT
 )

AS
 DECLARE @HashThis nvarchar(256);
 SELECT @HashThis = CONVERT(nvarchar(256), @stringToHash);
 SELECT @hashedString = HashBytes('SHA1', @HashThis);

2 个答案:

答案 0 :(得分:3)

HashBytes返回VARBINARY结果,即。一个字节数组。我强烈建议您保留此类型,不要将其转换为字符串。如果必须转换它,请使用Base64编码。

现在,您的过程将散列转换为Unicode字符串,但这是不正确的,因为并非所有字节组合在Unicode中都有效,并且散列可能会在无效的Unicode字符上出现。

ALTER PROCEDURE dbo.ConvertToHash
 (
 @stringToHash nvarchar(256),
 @hashedString binary(20) OUTPUT
 )
AS
 SET @hashedString = HashBytes('SHA1', @stringToHash);

确保将散列值保留为代码中的BINARY(20)无处不在,并在客户端中将其用作byte[]。永远不要将哈希值转换为字符串(这适用于所有语言和平台)。

答案 1 :(得分:1)

您的最终选择语句是分配值而不是返回它。您可以在相关变量上发出另一个select语句(下面包含的修改代码供您参考),或者您可以按照Remus的建议将OUTPUT参数合并到您的存储过程设计中。

ALTER PROCEDURE dbo.ConvertToHash

 (
 @stringToHash nvarchar(256),
 @hashedString nvarchar(256) OUTPUT
 )

AS
 DECLARE @HashThis nvarchar(256);
 SELECT @HashThis = CONVERT(nvarchar(256), @stringToHash);
 SELECT @hashedString = HashBytes('SHA1', @HashThis);
 SELECT @hashedString