Java / Python MD5实现 - 如何克服无符号32位要求?

时间:2013-08-28 15:03:57

标签: java python md5 unsigned-integer

我正在尝试在Python / Java中实现MD5(出于好奇心),并且正在有效地将wikipedia MD5页面的伪代码转换为任一种语言。首先,我使用Java,只是遇到其负/正整数溢出的挫折(因为无符号整数不是一个选项,for-all integer,-2147483648 <= integer <= 2147483647)。然后我决定使用Python,它更适合于繁重的数值计算,但我意识到我无法克服无符号的32位整数要求(因为Python立即将包裹的int转换为{ {1}} S)。

有没有办法解决Java / Python缺少long s,这是上述MD5伪代码所要求的?

2 个答案:

答案 0 :(得分:1)

由于所有操作都是按位操作,因此除了右移之外,它们不会受到符号扩展(这会导致问题)。

为此目的,Java有一个>>>运算符。

答案 1 :(得分:0)

事先作为说明 - 我不知道这是否是好的解决方案,但它似乎可以提供您想要的行为。

使用the ctypes module,您可以直接访问底层的低级数据类型,因此在Python中有一个unsigned int。

具体来说,ctypes.c_uint

>>> i = ctypes.c_uint(0)
>>> i.value -= 1
>>> i                                                            
c_uint(4294967295)
>>> i.value += 1
>>> i
c_uint(0)

这可以说是对模块的滥用 - 它设计用于在Python中轻松使用C代码,但正如我所说,它似乎有效。我能想到的唯一真正的缺点是我认为ctypes具体是CPython。