SQL Server HashBytes 函数

Posted

技术标签:

【中文标题】SQL Server HashBytes 函数【英文标题】:SQL Server HashBytes Function 【发布时间】:2015-12-22 16:20:45 【问题描述】:

有人可以告诉我为什么我得到以下不同的答案:

这是一个非常简单的函数,用于返回哈希值:

CREATE Function [fn_GetPin](@strText VARCHAR(254))
RETURNS VARCHAR(254)
AS
BEGIN
    SET @strText = HashBytes('MD5', @strText);
    RETURN @strText;
END

这是我的 SQL,它返回 2 个不同的值:

SELECT HashBytes('MD5', '7690') as Hash1
        , dbo.fn_GetPin('7690') AS Hash2

结果:

Hash1   Hash2
0xC6776F93BC9AFE2E511A1DBD5478362C  Æwo“¼šþ.Q½Tx6,

由于某种原因,该函数没有返回与 HASH1 相同的值。 我只是不确定为什么。

谢谢。

更新:

接受的答案如下,我只是将 (max) 添加到 VARBINARY 以返回整个值。谢谢大家。

CREATE Function [fn_GetPin](@strText VARCHAR(254))
RETURNS VARBINARY(max)
AS
BEGIN
    Return HashBytes('MD5', @strText);
END

【问题讨论】:

我认为这是因为函数 HashBytes 返回 varbinary 并且您的(可能是交互式的?)结果有点十六进制。您的函数强制返回 varchar,因此它向您显示解释为字符串的二进制 blob。 小事,但 MD5 不再是推荐的哈希算法,因为您看起来正在做的事情(理想情况下哈希也会加盐)。如果您在 mssqltips.com/sqlservertip/2988/… 了解更多信息。 谢谢@eftpotrm 我使用 MD5 只是为了测试目的。原来我们使用的是 SHA1。 【参考方案1】:
CREATE Function [fn_GetPin](@strText VARCHAR(254))
RETURNS VARBINARY
AS
BEGIN
    Return HashBytes('MD5', @strText);
END

函数应该返回一个varbinary 值。

【讨论】:

【参考方案2】:

pvg 几乎把它钉在了上面。

CREATE Function [fn_GetPin](@strText VARCHAR(254))
RETURNS VARBINARY
AS
BEGIN
    SET @strText = HashBytes('MD5', @strText);
    RETURN CAST(@strText as VARBINARY);
END

【讨论】:

以上是关于SQL Server HashBytes 函数的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server内置函数实现MD5加密

MSSQL Sql加密函数 hashbytes 用法简介

将 hashbytes() 函数的输出插入表中

SQL Server 内置函数实现MD5加密

将 sql 结果集聚合为 HashBytes 值

sqlserver 怎么查看表的数据是加密的