0

我正在尝试在 Python/Java 中实现 MD5(出于好奇),并且正在有效地将维基百科 MD5页面的伪代码翻译成任何一种语言。首先,我使用 Java,只是因为它的负/正整数溢出而感到沮丧(因为无符号整数不是一个选项,for-all integer,-2147483648 <= integer <= 2147483647)。然后我使用了 Python,在确定它更适合繁重的数值计算之后,但意识到我也无法克服无符号 32 位整数的要求(因为 Python 立即将包装int的 s 转换为longs)。

有什么办法可以解决unsigned 32-bit integer前面提到的 MD5 伪代码所要求的 Java/Python 缺少 s 的问题?

4

2 回答 2

1

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

Java 有一个>>>用于此目的的运算符。

于 2013-08-28T15:12:46.213 回答
0

作为事先说明 - 我不知道这是否是一个好的解决方案,但它似乎给出了你想要的行为。

使用module ,您可以直接访问底层ctypes低级数据类型,因此在 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 特定的。

于 2013-08-28T15:16:57.330 回答