如何在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;
逻辑解释
md5('TEST')生成的十六进制字符串前16位为033bd94b1168d7e4,对应字节顺序为03 3b d9 4b 11 68 d7 e4- 小端字节序要求反转字节顺序,即变为
e4 d7 68 11 4b d9 3b 03 - 通过
substring截取每两个字符并按反转后的顺序拼接,再转换为bigint,最终得到的结果就是-1956981089572930813,与C#代码输出完全一致。
内容的提问来源于stack exchange,提问作者MOOKERAIZER
相关产品推荐
相关产品推荐

