gifts2017

Расчет CRC32

Опубликовал GAlexis (GAlexis) в раздел Программирование - Универсальные функции

Расчет CRC32 без использования внешних компонент

Расчет CRC32 без использования внешних компонент.

Алгоритм можно ускорить, но меня устраивает и так, как есть.

У меня используется для небольших объемов данных.

Легко переносится на 8-ку

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Расчет CRC32
.ert 42,50Kb
26.04.12
34
.ert 42,50Kb 34 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Доржи Балбаров (Angeros) 27.04.12 03:51
Подскажите для чего это можно применить? И каков принцип кодирования в crc32?
2. GAlexis (GAlexis) 27.04.12 07:45
Алгоритм CRC32 устроен так, что небольшие изменения в ДАННЫХ вызывают большие изменения в подписи CRC32.
Я использую для сверки бумажных и электронных накладных, печатая CRC32 на накладной в виде штрихкода.
3. Иван Иванов (Famza) 27.04.12 08:42
(2) Штрих-код - это конечно хорошо, а как происходит сверка штрих-кодов у вас?
4. GAlexis (GAlexis) 27.04.12 08:50
Извиняюсь не правильно понял вопрос первый раз.
На накладной в виде ШК есть номер накладной и ШК CRC32 табличной части.
Сканируется ШК CRC32 потом Номер накладной повторно вычисляется CRC32 сравнивается.
5. Татьяна Гулак (Gulak) 02.05.12 11:06
6. Евгений _ (Johny_v) 25.05.12 12:31
А ты проверял возникновение коллизий?
Например если кодировать уид 20тыс. элементов, то сколько будет разных элементов с одинаковым CRC32?
7. GAlexis (GAlexis) 25.05.12 13:22
Алгоритм предназначен для контроля ошибок, а не для кодирования, на сколько я понимаю.
Честно говоря мне не совсем ясно для чего каждый отельный УИД нужно кодировать CRC32.

Алгоритм CRC32 придуман не мной и мной не исследовался.
Возможно эта информация Вам поможет:
Wikipedia CRC32
В частности там указано что, CRC32 используется в Ethernet, FDDI, iSCSI ...

Если Вам нужна меньшая вероятность совпадений смотрите в сторону MD5 и т.п.
8. Евгений _ (Johny_v) 25.05.12 16:38
Спасибо за ссылку, я смотрел эту статью.
md5 однозначно не подходит.
Слишком большое выходное значение получается. Мне нужно получить максимум 10 символов.
Из найденного подходят методы Adler32 и CRC32.

Кстати первый работает очень быстро и просто программируется, но у него возможны коллизии.
Проверял на 20 тыс. элементов получилось около 900 ошибок (разных элементов с одним хешем).
С CRC32 я думаю меньше будет.
9. GAlexis (GAlexis) 27.05.12 11:46
Проверял на 20 тыс. элементов получилось около 900 ошибок

Зачем нужно кодировать каждый УИД отдельно?
10. Евгений _ (Johny_v) 28.05.12 09:24
Нужно для каждого элемента получить уникальный код который пользователь должен будет ввести вручную (поэтому и ограничение по длине кода). Он должен быть не по порядку, чтобы исключить подбор вручную. Кончено может совпасть так, что код будет по порядку, но вероятность меньше.
11. Евгений _ (Johny_v) 28.05.12 10:05
После проверки 18000 элементов
Adler32 выдал 652 коллизии
CRC32 выдал 4 коллизии
Выводы: метод не подходит для этой задачи. Он не обеспечивает необходимой уникальности.
Буду искать другие способы.
12. Евгений _ (Johny_v) 28.05.12 10:11
Кстати, для проверки сделал внешнюю компоненту.
18тыс элементов за 1 секунду закодировала.
Если нужна могу скинуть.
13. GAlexis (GAlexis) 31.05.12 07:59
После проверки 18000 элементов
Adler32 выдал 652 коллизии
CRC32 выдал 4 коллизии
Выводы: метод не подходит для этой задачи. Он не обеспечивает необходимой уникальности.

Ну и в принципе если ты большую строку преобразуешь в меньшую и по одной нельзя воссоздать другую в точности, то ты неизбежно получишь коллизии.
14. Максим Соколов (maksim32) 08.01.13 22:52
Johny_v, да, кинь компоненту пожалуйста!!! Очень нужна! Спасибо
15. Владислав Рожевский (vvr908) 06.02.15 22:54
Автору спасибо!

Есть один нюанс:
Я скачал обработку и переписал код под 8-ку. Потом решил проверить, совпадет ли расчет с методом ХешированиеДанных() из платформы 8.3.
Результат не совпал.

Похоже, что в платформе используется алгоритм CRC32B (расчет из платформы совпал с расчетом онлайн-конвертера CRC32B http://hash.online-convert.com/crc32b-generator). А какой алгоритм используется в этой обработке, я пока не успел выяснить - но, похоже, не CRC32B. С аналогичным онлайн-расчетом CRC32 он тоже не совпадает.

Так что не знаю, используйте на свой страх и риск. Хотя может, конечно, я криво код переписал под 8-ку...
16. GAlexis (GAlexis) 16.03.15 08:14
(15) vvr908, Прошу прощения за поздний ответ, но у меня все под 7.7 совпадало со всеми генераторами. В 8.3 есть функция расчета CRC она не устраивает? Могу переписать код под 8 ку.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа