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

如何在Amazon Redshift中复现C#的MD5转BigInt逻辑?

在Amazon Redshift中复现C#的MD5转Int64逻辑

问题场景

我有一段C#代码,通过MD5哈希字符串后取前8字节转换为Int64,得到结果 -1956981089572930813:

using System;
using System.Security.Cryptography;
using System.Text;

public class Program
{
    public static void Main()
    {
        string profileId = "TEST";
        using (MD5 md5 = MD5.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(profileId);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            long hashCode = BitConverter.ToInt64(hashBytes, 0);
            Console.WriteLine(hashCode);
        }
    }
}

尝试用Redshift SQL复现该逻辑:

select from_hex(substring(md5('TEST'), 1, 16))::bigint

得到结果 233018722177570788,和预期不符,请问如何在Redshift中得到和C#一致的结果?

问题原因

C#的BitConverter.ToInt64默认使用小端字节序解析字节数组,而Redshift的from_hex转换为bigint时采用大端字节序,两者字节顺序处理逻辑相反,导致结果差异。

解决方案

要复现C#的逻辑,需要将MD5哈希的前8字节(对应16位十六进制字符串)按小端顺序重新排列后再转换为bigint:

SELECT 
    from_hex(
        substring(md5('TEST'), 15, 2) ||
        substring(md5('TEST'), 13, 2) ||
        substring(md5('TEST'), 11, 2) ||
        substring(md5('TEST'), 9, 2) ||
        substring(md5('TEST'), 7, 2) ||
        substring(md5('TEST'), 5, 2) ||
        substring(md5('TEST'), 3, 2) ||
        substring(md5('TEST'), 1, 2)
    )::bigint AS result;

逻辑解释

  1. md5('TEST')生成的十六进制字符串前16位为033bd94b1168d7e4,对应字节顺序为03 3b d9 4b 11 68 d7 e4
  2. 小端字节序要求反转字节顺序,即变为e4 d7 68 11 4b d9 3b 03
  3. 通过substring截取每两个字符并按反转后的顺序拼接,再转换为bigint,最终得到的结果就是-1956981089572930813,与C#代码输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:22:37