Я пытаюсь создать контрольные суммы CRC32 в Ruby и Python для одной и той же строки и получить разные результаты.
питон
from zlib import crc32
x = "SheetJS"
crc32(x)
#=> -1647298270
NodeJS
var CRC32 = require('crc-32');
var x = "SheetJS";
CRC32.str(x);
#=> -1647298270
Рубин
require 'zlib'
x = "SheetJS"
Zlib::crc32(x)
#=> 2647669026
Это те же самые значения, разница в интерпретации. Python и NodeJS интерпретируют crc32 как подписанное число, Ruby - как unsigned. Взглянуть:
In [1]: import struct
In [2]: struct.unpack('i', struct.pack('I', 2647669026))
Out[2]: (-1647298270,)
Мы преобразуем 2647669026 в байты как целое без знака, а затем читаем его как подписанное.