Python的hash.digest()在C#中对应使用什么编码?

2 投票
3 回答
1791 浏览
提问于 2025-04-15 23:31

我正在把一个Python程序移植到C#。这里有一行代码本来是想帮我理清思路,但现在让我很头疼:

hash = hashlib.md5(inputstring).digest()

在C#中生成一个类似的MD5哈希是非常重要的,我必须创建一个和原来的Python程序生成的哈希字符串一样的,否则我的整个应用程序就会出问题。

我现在困惑的是,在C#中转换成字符串时应该使用哪种编码,也就是:

?Encoding enc = new ?Encoding();
string Hash =enc.GetString(HashBytes); //HashBytes is my generated hash

因为我在使用Encoding.Default时,无法生成两个相似的哈希,也就是:

string Hash = Encoding.Default.GetString(HashBytes);

所以我在想,如果知道Python中hash.digest()的默认编码会不会有帮助。

编辑

好吧,也许再多一些代码能更清楚地说明我的问题。在Python程序计算出哈希后,还会进行一些计算,也就是:

hash = hashlib.md5(inputstring).digest()

for i in range(0,6):

value += ord(hash[i])

return value

现在你能明白为什么两个不同的哈希字符串会有问题吗?在运行Python程序时出现的一些字符在C#中被替换成了'?'。

3 个回答

0

根据文档,Python中的字符串默认是ASCII编码。其他编码方式必须明确指定。所以,你应该可以把一个ASCII字符串传给C#的MD5库,得到的哈希字节和你把这个字符串传给Python的MD5库时得到的结果是一样的。

2

这根本没有经过编码,它只是两种语言中的一组字节数组。

5

我猜你使用的是比Python 3更早的版本,你的字符串是普通的 str 类型。

如果你说的是输出,digest方法返回的是由原始字节组成的字符串。在C#中,相应的类型是 byte[],你似乎已经有这个了。它不是文本,所以使用Encoding类就没什么意义了。

如果你说的是输入, md5 函数接受的是普通的 str,也就是字节字符串。你需要查看之前的代码,弄清楚数据是什么编码的。

编辑:

关于你发布的代码,它的作用就是把哈希值的前六个字节的值加在一起。你应该能在C#中找到方法来实现这个。

另外,确保你了解字节字符串和字符字符串之间的区别。

撰写回答