SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » CRC32 (чтобы как у всех)
CRC32 [сообщение #3859] Thu, 30 November 2023 15:57 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 130
Зарегистрирован: August 2022
Senior Member
Firebird 4.0.3
SQL> select
CON>     hash( 'Z' using CRC32 )
CON>   from
CON>     rdb$database;

        HASH
============
  1733803097  (0x6757BC59)
"Руководство по языку SQL СУБД Firebird 4.0" утверждает, что для расчета берется полином 0x04C11DB7.
Однако вот здесь, например,
    https://crccalc.com/?crc=Z&method=crc32&datatype=asc ii&outtype=0
среди разных вариантов полученный результат не находится, а хотелось бы. Встроенный в Java алгоритм, тоже отталкивающийся от 0x04C11DB7, дает результат 0x59BC5767, как и в первой строке таблицы калькулятора. Уже 2 против 1, другие источники тоже встали на сторону большинства.

Это баг, фича или я чего-то не понимаю? Хотелось бы получить контрольную сумму, согласующуюся с внешними генераторами.

P.S.
О, сорри, увидел! Это же зеркальное отражение! Не знаю, насколько правильно интерпретируется здесь integer, во-всяком случае, понятно, как добиться нужного результата.

P.P.S.
По-моему, все-таки неправильно. Но менять теперь нельзя, это уже сакральное знание.

[Обновления: Thu, 30 November 2023 16:07]

Известить модератора

Re: CRC32 [сообщение #3860 является ответом на сообщение #3859] Thu, 30 November 2023 17:52 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 274
Зарегистрирован: June 2022
Senior Member
Число в памяти может быть представлено по разному

Число 1733803097
big endian - 6757BC59
little endian - 59BC5767

Вообще не хватает встроенной функции для конвертации чисел (SMALLINT, INTEGER, BIGINT, INT128) в представление в памяти и обратно.

Re: CRC32 [сообщение #3861 является ответом на сообщение #3860] Thu, 30 November 2023 18:04 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 746
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
sim_84

Число в памяти может быть представлено по разному
и чо, на разных платформах будет разный CRC?
Re: CRC32 [сообщение #3862 является ответом на сообщение #3861] Thu, 30 November 2023 18:16 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 77
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Member
Контрольные суммы считаются побайтово и, разумеется, зависят от порядка байт.
Именно поэтому используется приведение к сетевому порядку байт там, где это критично.
Re: CRC32 [сообщение #3863 является ответом на сообщение #3862] Thu, 30 November 2023 18:28 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 746
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
basid
Контрольные суммы считаются побайтово и, разумеется, зависят от порядка байт.
Именно поэтому используется приведение к сетевому порядку байт там, где это критично.
опять закат солнца вручную?
Re: CRC32 [сообщение #3864 является ответом на сообщение #3861] Thu, 30 November 2023 19:09 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 274
Зарегистрирован: June 2022
Senior Member
МП писал(а) Thu, 30 November 2023 18:04
sim_84

Число в памяти может быть представлено по разному
и чо, на разных платформах будет разный CRC?
Я к тому что функция возвращает integer. Как тс интерпретировал число в байтах уже другой вопрос
Re: CRC32 [сообщение #3865 является ответом на сообщение #3864] Thu, 30 November 2023 20:22 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 130
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Thu, 30 November 2023 19:09

Я к тому что функция возвращает integer. Как тс интерпретировал число в байтах уже другой вопрос
ТС никак не интерпретировал. Функция возвращает integer, и ТС просто взял этот integer и сравнил с аналогичными функциями других платформ, возвращающих такой же integer. Оказалось, что не такой же. Здесь нет числа в памяти, здесь есть значение целого числа "в воздухе", записанное цифирками 1733803097 (0x6757BC59). А должны быть цифирки 1505515367 (0x59BC5767).

Извините, но хеш-функции должны для одинаковых входных данных возвращать одинаковые результаты независимо от платформы. Здесь нет места расизму.

[Обновления: Thu, 30 November 2023 20:23]

Известить модератора

Re: CRC32 [сообщение #3866 является ответом на сообщение #3859] Thu, 30 November 2023 23:42 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 261
Зарегистрирован: August 2022
Senior Member
Firebird использует библиотеку LibTomCrypt для алгоритмов шифрования и хеширования.

Насколько я вижу, реализация LibTomCrypt меняет порядок байт при возврате результата

https://github.com/libtom/libtomcrypt/blob/develop/src/misc/ crc32.c#L171


Причём, там же есть тикет на эту тему

https://github.com/libtom/libtomcrypt/pull/122

желающие покопаться могут читать комментарии
Re: CRC32 [сообщение #3867 является ответом на сообщение #3863] Fri, 01 December 2023 06:46 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 77
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Member
МП писал(а) Thu, 30 November 2023 23:28
опять закат солнца вручную?
... и это (практически) все уже договорились о порядке передачи бит в байте. И о размере байта - тоже успели договориться и даже назвали его октетом.
Re: CRC32 [сообщение #3869 является ответом на сообщение #3867] Fri, 01 December 2023 12:45 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 746
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
basid
... и это (практически) все уже договорились о порядке передачи бит в байте. И о размере байта - тоже успели договориться и даже назвали его октетом.
– Вы ставите нереальные планы.
– Это, как его, валюнтаризм!
©
Re: CRC32 [сообщение #3872 является ответом на сообщение #3869] Fri, 01 December 2023 15:25 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 319
Зарегистрирован: August 2022
Senior Member
Если функция выдаёт целое число, то на клиента это число должно приходить в нативном формате. Никто не станет использовать isc_portable_integer() на содержимое MessageBuffer. Если с CRC это не так - трекер ждёт.

PS: ТомКрипт вообще местами дурная библиотека со странными правилами.
PPS: Поэтому у себя я вообще его изничтожил, заменив на гораздо более простой и предсказуемый (Фаст)ТомМатч.

[Обновления: Fri, 01 December 2023 15:32]

Известить модератора

Re: CRC32 [сообщение #3873 является ответом на сообщение #3872] Fri, 01 December 2023 16:16 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 130
Зарегистрирован: August 2022
Senior Member
Результат выполнения подобной функции никак не должен зависеть от платформы и реализации. Может, но не должен. Ни от способа представления числа, ни от порядка байт в памяти, ни от протокола передачи, ни от порядка дырочек в перфокарте, ни от чего. Поскольку сейчас хеши для проверки целостности и подлинности используют не только лишь все, а на разных концах каналов работают реализации от совершенно разных провайдеров на совершенно разных платформах, легко представить последствия подобных вольностей. Вообще от наличия компьютера не должен зависеть. Если взять бумагу с ручкой, описание алгоритма, и делить в столбик, должны получить ровно те же цифирки, что и компьютерные реализации. Прошу простить за лирику.

Посмотрел обсуждение тикета. Еще в 17 году обнаружили, что хеш от строки "libtomcrypt" выдает OxEF7673B3, в то время как должен быть OxB37376EF. По этому тикету тут же внесли исправление, однако воз и ныне там, выдается OxEF7673B3, как и до революции. Есть подозрение, что такая неприятность происходит на моей Wintel платформе, а на других, возможно, иначе. Ибо в коде замечены defines ENDIAN_LITTLE и ENDIAN_BIG, которые выставляются, скорее всего, в зависимости от платформы. Если у кого есть под рукой Firebird 3.0 и выше не на Windows и не на Intel, проверьте, пожалуйста, просто любопытно. Должно быть

hash( 'libtomcrypt' using CRC32 ) = 3010688751 (а не -277449805)

По факту констатируем, что Firebird 4.0.3 (Windows+IA) при расчете CRC32 возвращает инвертированное значение. Этот факт подлежит исправлению или, по-крайней мере, фиксации и документированию. В тикеты Firebird пока еще ни разу не писал, ну да лиха беда начало.
Re: CRC32 [сообщение #3874 является ответом на сообщение #3873] Fri, 01 December 2023 17:50 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 274
Зарегистрирован: June 2022
Senior Member
Так то так, но есть обратная совместимость. Неизвестно сколько людей уже успели посчитать хеш в фб так как он сейчас считается. Исправить можно, но тогда придется где-то временный параметр в конфиге иметь для переключения поведения.
Re: CRC32 [сообщение #3875 является ответом на сообщение #3874] Fri, 01 December 2023 18:29 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 746
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
не надо городить огород.
"исправленную" функцию нужно обозвать по-другому.
и всё.
а старую объявить deprecated.
Re: CRC32 [сообщение #3877 является ответом на сообщение #3875] Sat, 02 December 2023 01:42 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 319
Зарегистрирован: August 2022
Senior Member
Ага, "TrueCRC"...
Re: CRC32 [сообщение #3883 является ответом на сообщение #3877] Mon, 04 December 2023 13:20 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 746
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
по аналогии с телефонами:

CRC32_PRO_ULTRA_MAX_SE2_PLUS
Re: CRC32 [сообщение #3884 является ответом на сообщение #3875] Mon, 04 December 2023 13:41 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
Добавить второй опциональный параметр в существующую HASH().
По умолчанию пусть работает как было.

[Обновления: Mon, 04 December 2023 13:42]

Известить модератора

Re: CRC32 [сообщение #3885 является ответом на сообщение #3884] Mon, 04 December 2023 15:22 Переход к предыдущему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 319
Зарегистрирован: August 2022
Senior Member
Параметр конфига с депрекацией в следующей версии - более типичное решение.
Предыдущая тема: Новый веб-сайт firebirdsql.org
Следующая тема: Новые возможности Firebird 5.0. SQL
Переход к форуму:
  


Текущее время: Tue Mar 05 09:21:29 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01739 секунд