我正在尝试编写一个存储过程,它将获取一个字符串,用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);
答案 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