Код (Text): def hash_xor(s) ln = len(s) tmp = 0 i = 0 while i<ln: tmp = tmp ^ ( ord(s[i]) ) i = i +1 return tmp print( hash_xor ("asdfasdfasd12421") ) Нужно чтоб число которое возвращает функция было длинной в 4 байта. А возвращает очень длинное число.... В общем хочу сделать еквивалент такого кода на С Код (Text): DWORD CalcHash(char *Str ) { DWORD dwHash = 0; char *CopyStr = Str; while ( *CopyStr != 0) { dwHash = dwHash ^ ( *CopyStr ); CopyStr++; } return dwHash; }
Так вы только результат обрежете до 4-х байт. А топикстартер похоже подразумевал, что и вычисления должны выполняться над 4-хбайнтными числами. А это не так. В Питоне целые числа не имеют ограничения на длину, длина у них в битах строго такая, какая необходима для двоичного представления этого числа (для положительных чисел - количество битов до первой старшей единички, для отрицательных - количество битов до самого старшего нолика плюс один бит). Пока дело касается только операций and, or, сложений или умножений целых чисел - разницы с представлением фиксированой длиной практически нет (пока длина не превышает фиксированную). А вот если дело касается операций побитовой инверсии или xor над числами с разными знаками - вот тут то разница сразу же вылезает даже для более коротких чисел.
Стоп. Не надо печалиться, вся жизнь впереди. Я, похоже, погорячился насчет жуткой разницы. Нет, в Питоне действительно битовая длина целых чисел изменяется на лету и не ограничена. Но Питон корректно использует расширение знака при операциях над числами разной битовой длины, и из-за этой подгонки численные результаты битовых операций оказываются в любых случаях соответствующими операциям над числами фиксированной длины, пока нет влияния старших битов на младшие (сдвиги вправо) совместно с переполнением У вас вроде сдвигов вправо нет, так что похоже GorluM прав, и достаточно просто преобразовать конечный результат к фиксированной длине.