Python против Javascript MD5 отличается для больших чисел - PullRequest
0 голосов
/ 24 января 2019

У меня есть следующий код в Python:

port_name = 'test-PR-2092'
print int(hashlib.md5(port_name).hexdigest(), 16) % 10000
// 353

В Javascript я использую библиотеку шифрования, чтобы попытаться сделать то же самое (у меня нет контроля над кодом Python, поэтому мне нужнооставьте то же самое):

parseInt(
  crypto
    .createHash('md5')
    .update('test-PR-2092')
    .digest('hex'),
  16
) % 10000
// 4160

Javascript дает совершенно другой результат.

Глядя на int, они очень похожи, за исключением того, что Javascript находится в научной нотации.

Python: 158458604564589336383831436621974090353
Javascript: 1.5845860456458934e+38

Кто-нибудь знает, откуда это расхождение?

Редактировать: Решил мою собственную проблему, а не дубликат, потому что никто не рекомендовал BigInteger в любом вопросе, который я видел

1 Ответ

0 голосов
/ 24 января 2019

Вот решение, которое я нашел, BigInteger может принять шестнадцатеричное значение напрямую, а не сначала преобразовать его в целое число.

const portHash = BigInteger(
    crypto
      .createHash('md5')
      .update('test-PR-2092')
      .digest('hex'),
    16
  )
    .mod(10000)
    .valueOf();
// 353

Ответ теперь такой же, как и у Python.

Вот библиотека: https://www.npmjs.com/package/big-integer

...