Алгоритм контрольной суммы EAN
Алгоритм контрольной суммы EAN — это метод вычисления одной проверочной цифры (контрольного разряда), предназначенный для выявления ошибок при вводе или считывании штриховых кодов, соответствующих международному стандарту European Article Number (EAN). Контрольная сумма является обязательным элементом кодов EAN-8, EAN-13, а также родственных стандартов (UPC, JAN, GTIN). Она вычисляется по модулю 10 на основе весовой схемы, чередующей коэффициенты 1 и 3.
История и стандартизация
Система штрихового кодирования EAN была разработана в 1976 году как европейский аналог американского стандарта Universal Product Code (UPC). В 1977 году была создана Международная ассоциация EAN (ныне GS1), которая закрепила единый алгоритм вычисления контрольной суммы для всех кодов, используемых в розничной торговле, логистике и управлении цепочками поставок. В 2005 году EAN был полностью интегрирован в глобальную систему GS1, и алгоритм контрольной суммы стал обязательным для всех глобальных идентификаторов товаров (GTIN).
Принцип вычисления
Контрольная цифра в кодах EAN рассчитывается по модулю 10 с использованием весовых коэффициентов. Для кодов чётной длины (например, EAN-13) веса для цифр, начиная с первой слева, чередуются по схеме 1-3-1-3... Для кодов нечётной длины (например, EAN-8) веса начинаются с коэффициента 3.
Алгоритм для EAN-13
Код EAN-13 состоит из 13 цифр, последняя из которых — контрольная. Вычисление выполняется в несколько шагов:
- Нумерация позиций. Цифры нумеруются слева направо от 1 до 12 (без учёта контрольной).
- Суммирование с весами. Каждая цифра на нечётной позиции (1, 3, 5...) умножается на 1, на чётной позиции (2, 4, 6...) — на 3. Все произведения складываются.
- Остаток от деления на 10. Вычисляется остаток от деления полученной суммы на 10.
- Вычисление контрольной цифры. Если остаток равен 0, контрольная цифра — 0. В противном случае контрольная цифра равна 10 минус остаток.
Пример для кода 460123456789 (первые 12 цифр):
- Цифры: 4, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- Веса: 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3
- Произведения: 4×1=4, 6×3=18, 0×1=0, 1×3=3, 2×1=2, 3×3=9, 4×1=4, 5×3=15, 6×1=6, 7×3=21, 8×1=8, 9×3=27
- Сумма: 4+18+0+3+2+9+4+15+6+21+8+27 = 117
- Остаток: 117 mod 10 = 7
- Контрольная цифра: 10 − 7 = 3
Полный код: 4601234567893.
Алгоритм для EAN-8
EAN-8 состоит из 8 цифр, последняя — контрольная. Весовая схема для 7 цифр (с 1-й по 7-ю) начинается с коэффициента 3: 3-1-3-1-3-1-3. Дальнейшие шаги идентичны алгоритму для EAN-13.
Проверка корректности кода
Для проверки правильности введённого или считанного кода используется обратная процедура: вычисляется контрольная сумма для всех 13 (или 8) цифр, включая контрольную, с теми же весами. Если полученная сумма делится на 10 без остатка, код считается корректным. В противном случае фиксируется ошибка.
Пример проверки кода 4601234567893:
- Цифры: 4, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3
- Веса: 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1
- Сумма: 4+18+0+3+2+9+4+15+6+21+8+27+3 = 120
- 120 mod 10 = 0 — код верен.
Математическая основа
Алгоритм основан на свойствах арифметики по модулю 10. Выбор весов 1 и 3 обусловлен тем, что они позволяют обнаруживать большинство распространённых ошибок:
- Одиночная ошибка (замена одной цифры на другую) — обнаруживается, если разность между правильной и ошибочной цифрой не кратна 10, что выполняется для всех цифр от 0 до 9.
- Транспозиция соседних цифр (перестановка двух рядом стоящих цифр) — обнаруживается, если веса этих позиций различны (1 и 3). Если веса одинаковы (например, в кодах нечётной длины), транспозиция может остаться незамеченной.
- Ошибка двойной транспозиции (перестановка цифр через одну) — обнаруживается не всегда.
Алгоритм не является криптостойким и не предназначен для защиты от намеренного искажения данных — его задача исключительно выявление случайных ошибок ввода или считывания.
Применение в системе GS1
Контрольная сумма EAN используется во всех глобальных идентификаторах GS1:
- GTIN-13 (ранее EAN-13) — основной идентификатор товаров в розничной торговле.
- GTIN-8 (ранее EAN-8) — применяется для товаров малого размера.
- GTIN-12 (ранее UPC-A) — используется в США и Канаде, алгоритм аналогичен, но веса начинаются с 3 для 11 цифр.
- SSCC (серийный код транспортной упаковки) — 18-значный код с контрольной цифрой по тому же алгоритму.
- GLN (глобальный номер местоположения) — 13-значный код для идентификации юридических и физических объектов.
В системе GS1 контрольная цифра вычисляется автоматически при генерации кода и входит в состав штрихового изображения. Сканеры штрих-кодов при считывании проверяют контрольную сумму и при её несовпадении выдают сигнал ошибки.
Ограничения
- Алгоритм не обнаруживает ошибки, при которых разность правильной и ошибочной цифры кратна 10 (например, замена 0 на 10, что невозможно в десятичной системе, но замена 5 на 5 даёт нулевую разность).
- Транспозиция цифр с одинаковыми весами (например, в EAN-8 позиции 2 и 4 имеют вес 1) может остаться незамеченной.
- Алгоритм не защищает от преднамеренного изменения кода — злоумышленник может подобрать другую комбинацию цифр с той же контрольной суммой.
Связанные алгоритмы
- Алгоритм Луна (Luhn algorithm) — используется для проверки номеров кредитных карт, также основан на модуле 10, но с удвоением цифр через одну.
- Алгоритм Верхоффа (Verhoeff algorithm) — более сложный метод с использованием перестановочной группы диэдра, обнаруживающий все одиночные ошибки и все транспозиции соседних цифр.
- Контрольная сумма для ISBN — для 13-значных номеров ISBN используется тот же алгоритм, что и для EAN-13, поскольку ISBN-13 является подмножеством GTIN-13.
Источники
- GS1 General Specifications, Release 23.0, January 2023.
- ISO/IEC 15420:2009 «Information technology — Automatic identification and data capture techniques — EAN/UPC bar code symbology specification».
- ГОСТ Р 51294.3-99 «Автоматическая идентификация. Штриховое кодирование. Символика EAN/UPC. Общие требования».
- D. L. Spooner, «Error Detection in Bar Codes», Journal of the Operational Research Society, 1994.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →