Как сделать PHP (int) (hexdec (getFirstNchars (sha1 ($ sfld), 8))) в Python? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь преобразовать строку в контрольную сумму SHA1, , которая используется в поле csum Анки .

sfld: 'Bonjour' - содержимое карты без HTML (первая часть полей, отфильтрованная).

csum: 4077833205 - Контрольная сумма строки SHA1 sfld, ограничена 8 цифрами. PHP: (int) (hexdec (getFirstNchars (sha1 ($ sfld), 8)))

Итак, я хочу преобразовать строку Bonjour и получить 4077833205.

Однако, хотя я пытался следовать этому посту , я не смог получить правильное значение.

int(hashlib.sha1(b"Bonjour").hexdigest(), 16) % (10**8) # 48831164

abs(hash(s)) % (10 ** 8) # 70576291

Также цифра также не совпадает, и значение csum составляет 10 цифр, хотя в документе говорится, что это 8 цифр. Так что я думаю, что неправильно понял.

Я проверил свою базу данных Anki и обнаружил, что значение столбца csum составляет от 7 до 10 цифр, хотя 10 цифр является наиболее распространенным.

Мой вопрос: что эквивалентно PHP (int)(hexdec(getFirstNchars(sha1($sfld), 8))) в Python и почему ответ выше не соответствует правильному значению?

1 Ответ

1 голос
/ 23 июня 2019

Мод-функция, которую вы используете в python для нарезки длины, находится не в том месте.Это происходит слишком поздно.

Код php выполняет sha1, обрезает возвращаемую шестнадцатеричную строку до 8 символов и затем преобразует это значение в десятичное число.Ваш код Python делает вещи в неправильном порядке.Это делает sha1, преобразует весь результат в десятичную, а затем сокращает это до 8 символов (с модом).

Python-эквивалент вашего php-кода:

int(hashlib.sha1(b"Bonjour").hexdigest()[:8],16)
...