2013-08-28 5 views
0

Я пытаюсь реализовать MD5 (ради любопытства) в Python/Java и эффективно переводить псевдокод страницы wikipedia MD5 на любой язык. Во-первых, я использовал Java только для того, чтобы встретить фрустрацию с ее отрицательным/положительным целым переполнением (поскольку unsigned ints не является опцией, for-all integer,-2147483648 <= integer <= 2147483647). Затем я использовал Python, решив, что он лучше подходит для тяжелых численных вычислений, но понял, что я не смог бы преодолеть 32-битное целочисленное требование без знака (либо, когда Python немедленно отбрасывает завернутые int s в long s).Реализация Java/Python MD5 - как преодолеть 32-битное требование без знака?

Есть ли способ взломать недостаток Java/Python unsigned 32-bit integer s, которые требуются вышеупомянутым псевдокодом MD5?

ответ

0

Как заблаговременно отметить - не знаю, является ли это хорошим решением, но, похоже, оно дает вам поведение.

Используя the ctypes module, вы можете получить доступ к базовому низкоуровневому типу данных и, следовательно, иметь неподписанный int в Python.

В частности, ctypes.c_uint:

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

Это, возможно, злоупотребление модуля - он предназначен для использования кода C легко внутри Python, но, как я говорю, это, кажется, работает. Единственный реальный недостаток, о котором я могу думать, это то, что я полагаю, что ctypes специфичен для CPython.

1

Поскольку все операции являются побитовыми операциями, они не пострадают от расширения знака (что вызовет проблемы), за исключением сдвига вправо.

Для этой цели у Java есть оператор >>>.

+1

+1. Люди переоценивают разницу между арифметикой с подписью и без знака, и большинство операций выйдут с тем же результатом. –