You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server 2016及以上版本生成SHA-3(256)哈希值

在SQL Server 2016中生成SHA-3(256)哈希值的方案

确实,SQL Server 2016的HASHBYTES函数仅支持SHA-2系列算法(SHA2_256、SHA2_512等),官方文档里也没有提及内置SHA-3的支持,这就是你调用HASHBYTES('SHA3_256', ...)返回NULL的原因。下面给你两种可行的解决方案:

一、使用CLR自定义函数(推荐,性能高效)

SQL Server支持通过CLR集成调用.NET的加密库,而.NET Framework 4.6及以上已经内置了SHA-3算法的实现,我们可以通过创建CLR函数来实现SHA3-256哈希计算。

步骤1:编写C#类库代码

创建一个C#类库项目,添加以下代码:

using System;
using System.Data.SqlTypes;
using System.Security.Cryptography;
using Microsoft.SqlServer.Server;

public class HashUtilities
{
    // 定义SQL可调用的SHA3-256函数
    [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
    public static SqlBytes ComputeSHA3_256(SqlString inputStr)
    {
        if (inputStr.IsNull)
            return SqlBytes.Null;
        
        // 使用.NET内置的SHA3算法
        using (var sha3Provider = SHA3.Create("SHA3-256"))
        {
            byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(inputStr.Value);
            byte[] hashResult = sha3Provider.ComputeHash(inputBytes);
            return new SqlBytes(hashResult);
        }
    }
}

编译这个项目生成DLL文件(注意选择和SQL Server兼容的.NET Framework版本,SQL Server 2016支持4.0及以上)。

步骤2:在SQL Server中注册CLR函数

以管理员权限执行以下SQL语句:

-- 开启CLR集成(默认是关闭的)
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'clr enabled', 1;
RECONFIGURE;
GO

-- 注册编译好的DLL程序集(替换为你的DLL实际路径)
CREATE ASSEMBLY HashUtilitiesAssembly
FROM 'C:\YourPath\HashUtilities.dll'
WITH PERMISSION_SET = SAFE;
GO

-- 创建自定义T-SQL函数,映射到CLR方法
CREATE FUNCTION dbo.SHA3_256(@input NVARCHAR(MAX))
RETURNS VARBINARY(32)
AS EXTERNAL NAME HashUtilitiesAssembly.HashUtilities.ComputeSHA3_256;
GO

步骤3:调用自定义函数

现在就可以像使用内置函数一样调用了:

DECLARE @HashThis NVARCHAR(32);
SET @HashThis = '123456';
SELECT dbo.SHA3_256(@HashThis);
-- 预期输出:0xB751850B1A57168A5693CD924B6B096E08F621827444F70D884F5D0240D2712E

二、纯T-SQL实现KECCAK算法(无CLR权限时使用)

如果你的环境无法启用CLR集成,也可以使用纯T-SQL编写KECCAK-256的实现(SHA-3的底层算法是KECCAK)。不过这种方法代码量较大,性能远不如CLR,适合小批量数据场景。

你可以参考KECCAK的官方规范编写T-SQL函数,或者找到开源的实现。假设已经创建了dbo.KECCAK256函数,调用示例如下:

DECLARE @HashThis NVARCHAR(32);
SET @HashThis = '123456';
SELECT dbo.KECCAK256(@HashThis);

额外提示

如果你有升级SQL Server的可能,SQL Server 2022及以后版本已经内置了SHA-3系列算法的支持,直接使用HASHBYTES('SHA3_256', @input)即可得到结果,无需额外配置。

内容的提问来源于stack exchange,提问作者SQLJax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:17:57