请求将C#实现的MSSQL Binary_Checksum转换为Lua代码
把C#的SQL Binary_Checksum转换为Lua实现
首先,先把你提供的C#代码补全(基于SQL Server官方BINARY_CHECKSUM的逻辑补全未写完的分支):
private static int SQLBinaryChecksum(string text) { long sum = 0; byte overflow; for (int i = 0; i < text.Length; i++) { sum = (long)((16 * sum) ^ Convert.ToUInt32(text[i])); overflow = (byte)(sum / 4294967296); sum = sum - overflow * 4294967296; sum = sum ^ overflow; } if (sum > 2147483647) sum = sum - 4294967296; else if (sum >= 32768 && sum <= 65535) sum = sum - 65536; else if (sum >= 65536 && sum <= 4294967295) sum = (int)(sum - 4294967296); return (int)sum; }
接下来是完全贴合原逻辑的Lua实现,同时适配Lua的数值和字符串特性:
function sql_binary_checksum(text) local sum = 0 local UINT32_MAX = 4294967296 local INT32_MAX = 2147483647 local UINT16_MAX = 65536 -- 遍历字符串的每个Unicode码点,对应C#的char逻辑 -- 处理UTF-16代理字符(C#会将U+10000及以上字符拆分为两个char) for _, codepoint in utf8.codes(text) do if codepoint > 0xFFFF then -- 拆分补充平面字符为两个UTF-16代理码元 local high_surrogate = 0xD800 + ((codepoint - 0x10000) >> 10) local low_surrogate = 0xDC00 + ((codepoint - 0x10000) & 0x3FF) -- 处理高代理码元 sum = (16 * sum) ~ high_surrogate local overflow = math.floor(sum / UINT32_MAX) % 256 sum = sum - overflow * UINT32_MAX sum = sum ~ overflow -- 处理低代理码元 sum = (16 * sum) ~ low_surrogate overflow = math.floor(sum / UINT32_MAX) % 256 sum = sum - overflow * UINT32_MAX sum = sum ~ overflow else -- 处理普通BMP字符 sum = (16 * sum) ~ codepoint local overflow = math.floor(sum / UINT32_MAX) % 256 sum = sum - overflow * UINT32_MAX sum = sum ~ overflow end end -- 调整数值到C# int的范围(-2147483648 到 2147483647) if sum > INT32_MAX then sum = sum - UINT32_MAX elseif sum >= 32768 and sum <= UINT16_MAX - 1 then sum = sum - UINT16_MAX elseif sum >= UINT16_MAX and sum <= UINT32_MAX - 1 then sum = sum - UINT32_MAX end return math.tointeger(sum) end
关键细节说明:
- 字符串适配:Lua默认用UTF-8存储字符串,所以用
utf8.codes遍历Unicode码点,同时补充了UTF-16代理字符的拆分逻辑,和C#的char处理完全对齐。 - 溢出模拟:Lua没有原生的强类型整数,所以用
math.floor(sum / 4294967296)计算溢出值,再取模256模拟C#的byte转换,最后保留sum的低32位。 - 数值调整:严格复刻原C#代码的分支逻辑,确保最终结果落在C#
int的取值范围内。
你可以用简单字符串(比如"hello world")测试,Lua和C#的输出应该完全一致。
内容的提问来源于stack exchange,提问作者Reminus
相关产品推荐
相关产品推荐

