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