DeadMorozBLR
Новичок
Особенности вычисления хеш-функции crc32b
Добый день! У меня есть скрипт, который скачивает файлы, режет их на куски и складывает. Встала задача вычисления контрольной суммы CRC32 для того, чтобы ее впоследствии можно было контролировать при сборке файла с помощью Total Commander.
Для вычисления контрольной суммы я воспользовался функциями hash_* и алгоритмом crc32b (он соответствует тому алгоритму, по которому вычисляет CRC32 Total Commander). К моему удивлению, на разных серверах и на разных ОС эта контрольная сумма вычисляется по-разному, а именно, в некоторых случаях порядок байт — обратный тому, который получается при вычислении CRC32 в Total Commander.
Изначально я думал, что обратный порядок байт получается на всех Unix-системах, однако, как показала практика, на разных Linux’ах результаты разные.
Для наглядности я написал скрипт и запустил его на четырех серверах:
В итоге получил следующие результаты:
Есть ли у кого-нибудь соображения, как можно определить по каким-то параметрам системы, какой порядок байт она выдаст в результате расчета? На настоящей момент я перед вычислением выполняю "калибровку" системы функцией выше и после вычисления хеша привожу его к нужному виду.
Добый день! У меня есть скрипт, который скачивает файлы, режет их на куски и складывает. Встала задача вычисления контрольной суммы CRC32 для того, чтобы ее впоследствии можно было контролировать при сборке файла с помощью Total Commander.
Для вычисления контрольной суммы я воспользовался функциями hash_* и алгоритмом crc32b (он соответствует тому алгоритму, по которому вычисляет CRC32 Total Commander). К моему удивлению, на разных серверах и на разных ОС эта контрольная сумма вычисляется по-разному, а именно, в некоторых случаях порядок байт — обратный тому, который получается при вычислении CRC32 в Total Commander.
Изначально я думал, что обратный порядок байт получается на всех Unix-системах, однако, как показала практика, на разных Linux’ах результаты разные.
Для наглядности я написал скрипт и запустил его на четырех серверах:
PHP:
function is_crc32b_reversed() {
$hash = hash_init('crc32b');
hash_update($hash, 'foo');
$crc32b = hash_final($hash);
switch ($crc32b) {
case '8c736521':
$reverted = false;
break;
case '2165738c':
$reverted = true;
break;
default:
$reverted = null;
break;
}
return $reverted;
}
var_dump(PHP_OS);
var_dump(is_crc32b_reversed());
Код:
-- Windows 7
D:\usr\local\php\php.exe -f test-crc32b.php
string(5) "WINNT"
bool(false)
-- Linux (Debian)
$ php -f test-crc32b.php
string(5) "Linux"
bool(true)
-- Linux (Redhat наверное)
$ php -f test-crc32b.php
string(5) "Linux"
bool(false)
-- FreeBSD 6
$ /hsphere/shared/php5/bin/php -f test-crc32b.php
string(7) "FreeBSD"
bool(true)