Вы можете очень легко реализовать алгоритм, выполняемый кодом C, на чистом Python, без необходимости каких-либо вещей ctypes
. Просто сделайте все это с обычными целыми числами Python и возьмите модуль в конце (старшие биты не будут влиять на младшие для операций, которые вы делаете):
def djb2(string: bytes) -> int: # note, use a bytestring for this, not a Unicode string!
h = 5381
for c in string: # iterating over the bytestring directly gives integer values
h = h * 33 + c # use the computation from the C comments, but consider ^ instead of +
return h % 2**64 # note you may actually want % 2**32, as this hash is often 32-bit
Как я прокомментировал в коде, поскольку это операция, определенная для строк байтов, вы должны использовать экземпляр bytes
в качестве аргумента. Обратите внимание, что существует множество различных реализаций этого алгоритма. Некоторые используют ^
(побитовый xor) вместо +
на шаге, где вы обновляете значение хеша, и часто определяется использование unsigned long
, которое обычно было 32-битным вместо явно 64-битного целого числа C версия в вашем вопросе использует.