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

如何在SQL Server中实现Python的SHA256哈希转十进制整数?

问题描述

我通过Python代码生成了字符串8508688361-CTU50066523的SHA256哈希值及对应的十进制大整数:

Python代码:

import hashlib

s = "8508688361-CTU50066523"
print(hashlib.sha256(s.encode('utf-8')).hexdigest())
print(int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16))

输出结果:

  • 十六进制哈希值:60f95246d58d304d29f71f73f1b5615dcb28b0f2a82e592b03df2536a461f718
  • 十进制整数:43862546236009694287120913811214596446612599063870465835323810000576872314648

已通过T-SQL获取到一致的十六进制哈希值:

SELECT
    CONVERT(varchar(1000), HASHBYTES('SHA2_256', '8508688361-CTU50066523'), 2)  

返回结果:60F95246D58D304D29F71F73F1B5615DCB28B0F2A82E592B03DF2536A461F718

但无法通过T-SQL将该十六进制值转换为对应的十进制大整数,求解决方案。


解决方案

SHA256哈希对应的是256位整数,远超过SQL Server内置BIGINT(64位)的存储范围,因此需要通过字符串逐位计算或CLR集成的方式实现转换。

方案1:纯T-SQL自定义函数

适合无CLR权限的环境,通过字符串操作逐位计算十进制值:

CREATE FUNCTION dbo.HexToBigDecimal(@hex VARCHAR(64))
RETURNS VARCHAR(78)
AS
BEGIN
    DECLARE @result VARCHAR(78) = '0'
    DECLARE @len INT = LEN(@hex)
    DECLARE @i INT = 1
    DECLARE @char CHAR(1)
    DECLARE @value INT
    DECLARE @temp VARCHAR(78)

    WHILE @i <= @len
    BEGIN
        SET @char = SUBSTRING(@hex, @i, 1)
        SET @value = CASE 
            WHEN @char BETWEEN '0' AND '9' THEN CAST(@char AS INT)
            WHEN @char BETWEEN 'A' AND 'F' THEN 10 + ASCII(@char) - ASCII('A')
            WHEN @char BETWEEN 'a' AND 'f' THEN 10 + ASCII(@char) - ASCII('a')
            ELSE 0
        END

        -- 结果乘以16
        SET @temp = ''
        DECLARE @carry INT = 0
        DECLARE @j INT = LEN(@result)
        WHILE @j >= 1
        BEGIN
            DECLARE @digit INT = CAST(SUBSTRING(@result, @j, 1) AS INT) * 16 + @carry
            SET @carry = @digit / 10
            SET @temp = CAST(@digit % 10 AS CHAR(1)) + @temp
            SET @j = @j - 1
        END
        IF @carry > 0
            SET @temp = CAST(@carry AS CHAR(1)) + @temp
        SET @result = @temp

        -- 加上当前位的值
        SET @temp = ''
        SET @carry = @value
        SET @j = LEN(@result)
        WHILE @j >= 1 AND @carry > 0
        BEGIN
            DECLARE @sum INT = CAST(SUBSTRING(@result, @j, 1) AS INT) + @carry
            SET @carry = @sum / 10
            SET @temp = CAST(@sum % 10 AS CHAR(1)) + @temp
            SET @j = @j - 1
        END
        IF @j >= 1
            SET @temp = SUBSTRING(@result, 1, @j) + @temp
        IF @carry > 0
            SET @temp = CAST(@carry AS CHAR(1)) + @temp
        SET @result = @temp

        SET @i = @i + 1
    END

    RETURN @result
END
GO

使用函数转换哈希值:

DECLARE @hexHash VARCHAR(64) = '60F95246D58D304D29F71F73F1B5615DCB28B0F2A82E592B03DF2536A461F718'
SELECT dbo.HexToBigDecimal(@hexHash) AS DecimalHash

执行后将得到与Python一致的十进制结果。

方案2:CLR集成函数(高效场景)

适合频繁转换的场景,利用C#的BigInteger类实现高效转换:

  1. 编写C#代码并编译为DLL:
using System;
using Microsoft.SqlServer.Server;

public class HashConverter
{
    [SqlFunction(DataAccess = DataAccessKind.None)]
    public static string HexToBigDecimal(string hex)
    {
        if (string.IsNullOrEmpty(hex))
            return string.Empty;
        return System.Numerics.BigInteger.Parse(hex, System.Globalization.NumberStyles.HexNumber).ToString();
    }
}
  1. 在SQL Server中注册CLR程序集并创建函数:
-- 启用CLR集成
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'clr enabled', 1;
RECONFIGURE;

-- 创建程序集(替换为你的DLL路径)
CREATE ASSEMBLY HashConverterAssembly
FROM 'C:\Path\To\HashConverter.dll'
WITH PERMISSION_SET = SAFE;

-- 创建CLR函数
CREATE FUNCTION dbo.CLR_HexToBigDecimal(@hex NVARCHAR(64))
RETURNS NVARCHAR(78)
AS EXTERNAL NAME HashConverterAssembly.HashConverter.HexToBigDecimal;
GO

使用方式:

DECLARE @hexHash VARCHAR(64) = '60F95246D58D304D29F71F73F1B5615DCB28B0F2A82E592B03DF2536A461F718'
SELECT dbo.CLR_HexToBigDecimal(@hexHash) AS DecimalHash

注意事项

  • 纯T-SQL函数兼容性强,但处理长字符串时效率略低;CLR函数效率更高,但需要启用CLR集成,部分环境可能有安全限制。
  • 确保输入的十六进制字符串有效(长度64,仅包含0-9、A-F/a-f字符)。

内容的提问来源于stack exchange,提问作者Abdullah Çataklı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:43