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

如何将C#中的Knuth哈希代码转换为SQL Server等效实现?

Knuth哈希算法的C#到SQL Server 2016转换实现

转换思路

原C#代码通过遍历字符串每个字符,基于初始哈希值执行「累加字符编码→乘固定因子」的迭代运算,最终返回哈希值的字符串形式。由于SQL Server无原生无符号64位整数类型,采用NUMERIC(20)存储中间哈希值(其范围完全覆盖64位无符号整数最大值)。

SQL Server 2016等效实现

创建标量函数实现对应逻辑:

CREATE FUNCTION dbo.CalculateKnuthHash(@read NVARCHAR(MAX))
RETURNS NVARCHAR(20)
AS
BEGIN
    -- 初始化哈希初始值,与C#代码完全一致
    DECLARE @hashedValue NUMERIC(20) = 3074457345618258791;
    DECLARE @i INT = 1;
    DECLARE @charCode INT;

    -- 处理空输入场景
    IF @read IS NULL
        RETURN NULL;

    -- 遍历字符串每个字符,模拟C#循环逻辑
    WHILE @i <= LEN(@read)
    BEGIN
        -- 获取当前字符的Unicode编码(对应C#中char的UTF-16码位)
        SET @charCode = UNICODE(SUBSTRING(@read, @i, 1));
        -- 执行累加与乘法运算
        SET @hashedValue = (@hashedValue + @charCode) * 3074457345618258799;
        SET @i = @i + 1;
    END

    -- 返回哈希值的字符串形式
    RETURN CAST(@hashedValue AS NVARCHAR(20));
END

使用示例

调用函数计算字符串哈希:

SELECT dbo.CalculateKnuthHash('test string') AS KnuthHash;

关键说明

  • 用UNICODE()而非ASCII()函数,确保与C#中char的UTF-16码位逻辑一致,支持多语言字符。
  • NUMERIC(20)的取值范围为0到99999999999999999999,完全容纳64位无符号整数最大值(18446744073709551615),避免运算溢出。
  • 函数支持NVARCHAR(MAX)输入,可处理超长字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:14