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

请求将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:15