如何将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
相关产品推荐
相关产品推荐

