C# Python';s hash.digest()的用法是什么?

C# Python';s hash.digest()的用法是什么?,c#,python,encoding,digest,C#,Python,Encoding,Digest,我正在尝试将python程序移植到c#。这句话本应是一个穿行,但现在却折磨着我: hash = hashlib.md5(inputstring).digest() 在c#中生成类似的MD5散列后,创建与原始python程序类似的散列字符串是绝对重要的,否则我的整个应用程序将失败 我的困惑在于在c#e中转换为字符串时使用哪种编码 因为我无法在使用编码时创建两个类似的哈希 string Hash = Encoding.Default.GetString(HashBytes); 所以我认为了解py

我正在尝试将python程序移植到c#。这句话本应是一个穿行,但现在却折磨着我:

hash = hashlib.md5(inputstring).digest()
在c#中生成类似的MD5散列后,创建与原始python程序类似的散列字符串是绝对重要的,否则我的整个应用程序将失败

我的困惑在于在c#e中转换为字符串时使用哪种编码

因为我无法在使用编码时创建两个类似的哈希

string Hash = Encoding.Default.GetString(HashBytes);
所以我认为了解python的deafult hash.digest()编码会有所帮助

编辑

好吧,也许更多的代码会更清楚地表达我的问题。在python程序中计算哈希后,将执行一些计算,即

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

for i in range(0,6):

value += ord(hash[i])

return value

现在您可以看到为什么两个不同的哈希字符串会出现问题了吗?运行python程序时出现的一些字符在C#中由“?”重新计算。

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

我假定您使用的是Python的早期版本,而不是3,并且您的字符串是一个普通的
str

如果您谈论的是输出,digest方法将返回一个由原始字节组成的字符串。C#中的等效类型是
byte[]
,您似乎已经拥有了它。它不是文本,所以使用编码类没有意义

如果您谈论的是输入,
md5
函数接受一个普通的
str
,它是一个字节字符串。在此之前,您必须查看代码,以了解数据的编码方式

编辑:

关于您发布的代码,它所做的只是获取散列中前六个字节的值并将它们相加。你应该能够在C#中找到如何做到这一点


并确保了解字节字符串和字符字符串之间的区别。

根据,Python字符串默认为ASCII。必须使用备用编码。因此,您应该能够将ASCII字符串传递到C#MD5库,并获得与将字符串传递到Python MD5库相同的哈希字节。

问题在于,哈希以字符串形式进行了大量计算,以生成整数结果。python散列字符串有奇怪的字符,c#只输出为???这会影响最终整数结果。它们根本不是真正的字符,这就是您感到困惑的地方。在python中,字符串只是用作任意二进制数据的容器,这是一个不幸的设计选择,因为早期python版本中缺少bytearray类型。在C#中,没有混淆,输出只是一个字节数组。如果取每个python“字符”的ord(),就会发现它与每个C#字节的值相同。字符串必须进行编码。哈希算法对字节[]数据进行操作,而不是对字符串进行操作。@Hank:我以为他指的是哈希的输出。你能显示两个程序中相同编码消息(比如“Hello world”)的示例字符串吗,因此,我们可以看到您正在尝试获取什么以及您当前拥有什么?例如:Python Hash=VŸY C#Hash=V?Yor Python Hash=A¥C|C#Hash=AñCIm仍然困惑不解。让我再发布一些代码,这样你就可以真正理解我的问题了。对不起,我对Python一无所知(2天了!)我的印象是代码中的字符被操纵了。让我尝试使用字节并比较输出。Python2字符串是字节字符串,我怀疑是否有任何应该使用的编码约定。这就是为什么我们现在在Python3中有了正确的字符串类型。这些链接与解析Python代码文件相关,而不是与此相关。
hash = hashlib.md5(inputstring).digest()

for i in range(0,6):

value += ord(hash[i])

return value