- Контрольное число (КЧ) в общероссийских классификаторах
- Советуем прочитать
- Контрольное число в классификаторах
- Методика расчета контрольного числа
- Простой расчет контрольной суммы
- Бит четности (1-битная контрольная сумма)
- 8-битная контрольная сумма
- 16-битная контрольная сумма
- 32-битная контрольная сумма
- 64-битная контрольная сумма
- Комментарии
Контрольное число (КЧ) в общероссийских классификаторах
— расчетное число, используемое для проверки правильности записи кода в общероссийских классификаторах.
Общероссийские классификаторы используют «коды», присваиваемые для обозначения классификационной группировки или объекта классификации. Кодв представляют собой совокупность знаков (символов).
Для проверки правильности записи кода используют контрольное число, которое рассчитывается на основании утвержденной методики.
Обычно КЧ применяется разработчиками классификатора, чтобы удостовериться в его правильности. Пользователи обычно пользуются кодами и позициями классификатора. Практического значения для пользователей показатель КЧ не имеет.
Методика расчета контрольного числа утверждена Приложением В к «ПР 50.1.024-2005. Правила стандартизации. Основные положения и порядок проведения работ по разработке, ведению и применению общероссийских классификаторов» (утв. и введены в действие Приказом Ростехрегулирования от 14.12.2005 N 311-ст) :
Приложение В
Контрольное число рассчитывается следующим образом:
1. Разрядам кода в общероссийском классификаторе, начиная со старшего разряда, присваивается набор весов, соответствующий натуральному ряду чисел от 1 до 10. Если разрядность кода больше 10, то набор весов повторяется.
2. Каждая цифра кода умножается на вес разряда и вычисляется сумма полученных произведений.
3. Контрольное число для кода представляет собой остаток от деления полученной суммы на модуль «11».
4. Контрольное число должно иметь один разряд, значение которого находится в пределах от 0 до 9.
Если получается остаток, равный 10, то для обеспечения одноразрядного контрольного числа необходимо провести повторный расчет, применяя вторую последовательность весов, сдвинутую на два разряда влево (3, 4, 5. ).
Если в случае повторного расчета остаток от деления вновь сохраняется равным 10, то значение контрольного числа проставляется равным «0».
Пример расчета контрольного числа:
Код 5 6 3 9 2 1
Вес разрядов 1 2 3 4 5 6
Сумма произведений, полученных путем умножения каждой цифры кода на вес разряда, равна:
5 х 1 + 6 х 2 + 3 х 3 + 9 х 4 + 2 х 5 + 1 х 6 = 78.
Остаток от деления полученной суммы на модуль «11» равен 1:
Контрольное число для данного кода равно 1.
Контрольные числа применяются во многих общероссийских классификаторах.
Обычно, в классификаторе, контрольное число обозначается отдельной графой «КЧ» и указывается к каждому коду классификатора.
Для примера приводим выдержку из «ОК 011-93. Общероссийский классификатор управленческой документации» (утв. Постановлением Госстандарта России от 30.12.1993 N 299) :
Код | КЧ | Наименование формы |
0200000 | 4 | УНИФИЦИРОВАННАЯ СИСТЕМА ОРГАНИЗАЦИОННО-РАСПОРЯДИТЕЛЬНОЙ ДОКУМЕНТАЦИИ |
0211000 | 0 | Документация по созданию организации |
0211111 | 7 | Положение об организации |
0211151 | 9 | Приказ о создании организации |
Рубрики:
Советуем прочитать
Стандарт бухгалтерского учета — документ, устанавливающий требования к ведению бухгалтерского учета, а также допустимые способы ведения бухгалтерского учета. Стандарты подразделяются на федеральные, отраслевые, международные и стандарты организации (экономического субъекта).
Источник
Контрольное число в классификаторах
Код из общероссийского классификатора |
Контрольное число (сумма) заданной последовательности |
Если вы работаете с общероссийскими классификаторами то несомненно успели заметить что кроме кодов, в справочниках ОКОФ, ОКП, ОКПДТР присутствует такое значение как контрольное число. О котором во всех классфикаторах говорится очень кратко: «Контрольное число рассчитано в соответствии с действующей Методикой расчета и применения контрольных чисел» (с) Что же это за методика? Методика расчета контрольного числаКонтрольное число рассчитывается следующим образом: 1. Разрядам кода в общероссийском классификаторе, начиная со старшего разряда, присваивается набор весов, соответствующий натуральному ряду чисел от 1 до 10. Если разрядность кода больше 10, то набор весов повторяется. 2. Каждая цифра кода умножается на вес разряда и вычисляется сумма полученных произведений. 3. Контрольное число для кода представляет собой остаток от деления полученной суммы на модуль «11». 4. Контрольное число должно иметь один разряд, значение которого находится в пределах от 0 до 9. Если в случае повторного расчета остаток от деления вновь сохраняется равным 10, то значение контрольного числа проставляется равным «0». Код 5 6 3 9 2 1 Вес разрядов 1 2 3 4 5 6 Сумма произведений, полученных путем умножения каждой цифры кода на вес разряда, равна: 5 х 1 + 6 х 2 + 3 х 3 + 9 х 4 + 2 х 5 + 1 х 6 = 78. Остаток от деления полученной суммы на модуль «11» равен 1: Контрольное число для данного кода равно 1. Источник Простой расчет контрольной суммыПри передачи данных по линиям связи, используется контрольная сумма, рассчитанная по некоторому алгоритму. Алгоритм часто сложный, конечно, он обоснован математически, но очень уж неудобен при дефиците ресурсов, например при программировании микроконтроллеров. Чтобы упростить алгоритм, без потери качества, нужно немного «битовой магии», что интересная тема сама по себе. Без контрольной суммы, передавать данные опасно, так как помехи присутствуют везде и всегда, весь вопрос только в их вероятности возникновения и вызываемых ими побочных эффектах. В зависимости от условий и выбирается алгоритм выявления ошибок и количество данных в контрольной сумме. Сложнее алгоритм, и больше контрольная сумма, меньше не распознанных ошибок. Причина помех на физическом уровне, при передаче данных. Вот пример самого типичного алгоритма для микроконтроллера, ставшего, фактически, промышленным стандартом с 1979 года. Не слабый такой код, есть вариант без таблицы, но более медленный (необходима побитовая обработка данных), в любом случае способный вынести мозг как программисту, так и микроконтроллеру. Не во всякий микроконтроллер алгоритм с таблицей влезет вообще. Давайте разберем алгоритмы, которые вообще могут подтвердить целостность данных невысокой ценой. Бит четности (1-битная контрольная сумма)На первом месте простой бит четности. При необходимости формируется аппаратно, принцип простейший, и подробно расписан в википедии. Недостаток только один, пропускает двойные ошибки (и вообще четное число ошибок), когда четность всех бит не меняется. Можно использовать для сбора статистики о наличии ошибок в потоке передаваемых данных, но целостность данных не гарантирует, хотя и снижает вероятность пропущенной ошибки на 50% (зависит, конечно, от типа помех на линии, в данном случае подразумевается что число четных и нечетных сбоев равновероятно). Часто разработчики забывают даже, что UART имеет на борту возможность проверки бита четности. Кроме целостности передаваемых данных, это позволяет избежать устойчивого срыва синхронизации (например при передаче данных по радиоканалу), когда полезные данные могу случайно имитировать старт и стоп биты, а вместо данных на выходе буфера старт и стоп биты в случайном порядке. 8-битная контрольная суммаЕсли контроля четности мало (а этого обычно мало), добавляется дополнительная контрольная сумма. Рассчитать контрольную сумму, можно как сумму ранее переданных байт, просто и логично Естественно биты переполнения не учитываем, результат укладываем в выделенные под контрольную сумму 8 бит. Можно пропустить ошибку, если при случайном сбое один байт увеличится на некоторое значение, а другой байт уменьшится на то же значение. Контрольная сумма не изменится. Проведем эксперимент по передаче данных. Исходные данные такие:
Передаем виртуальную телеграмму N раз. Идеальная контрольная сумма выявит ошибку по количеству доступной ей информации о сообщении, больше информации, выше вероятность выявления сбойной телеграммы. Вероятность пропустить ошибку, для 1 бита контрольной суммы:
на 256 отправленных телеграмм с ошибкой, одна пройдет проверку контрольной суммы. Смотрим статистику от виртуальной передачи данных, с помощью простой тестовой программы: Или условный КПД=55%, от возможностей «идеальной» контрольной суммы. Такова плата за простоту алгоритма и скорость обработки данных. В целом, для многих применений, алгоритм работоспособен. Используется одна операция сложения и одна переменная 8-битовая. Нет возможности не корректной реализации. Поэтому алгоритм и применяется в контроллерах ADAMS, ICP, в составе протокола DCON (там дополнительно может быть включен бит четности, символы только ASCI, что так же способствует повышению надежности передачи данных и итоговая надежность несколько выше, так как часть ошибок выявляется по другим, дополнительным признакам, не связанных с контрольной суммой). Не смотря на вероятность прохождения ошибки 1:143, вероятность обнаружения ошибки лучше, чем 1:256 невозможна теоретически. Потери в качестве работы есть, но не всегда это существенно. Если нужна надежность выше, нужно использовать контрольную сумму с большим числом бит. Или, иначе говоря, простая контрольная сумма, недостаточно эффективно использует примерно 0.75 бита из 8 имеющихся бит информации в контрольной сумме. Для сравнения применим, вместо суммы, побитовое сложение XOR. Стало существенно хуже, вероятность обнаружения ошибки 1:67 или 26% от теоретического предела. Упрощенно, это можно объяснить тем, что XOR меняет при возникновении ошибке еще меньше бит в контрольной сумме, ниже отклик на единичный битовый сбой, и повторной ошибке более вероятно вернуть контрольную сумму в исходное состояние. Так же можно утверждать, что контрольная сумма по XOR представляет из себя 8 независимых контрольных сумм из 1 бита. Вероятность того, что ошибка придется на один из 8 бит равна 1:8, вероятность двойного сбоя 1:64, что мы и наблюдаем, теоретическая величина совпала с экспериментальными данными. Нам же нужен такой алгоритм, чтобы заменял при единичной ошибке максимальное количество бит в контрольной сумме. Но мы, в общей сложности, ограниченны сложностью алгоритма, и ресурсами в нашем распоряжении. Не во всех микроконтроллерах есть аппаратный блок расчета CRC. Но, практически везде, есть блок умножения. Рассчитаем контрольную сумму как произведение последовательности байт, на некоторую «магическую» константу: Константа должна быть простой, и быть достаточно большой, для изменения большего числа бит после каждой операции, 211 вполне подходит, проверяем: Всего 72% от теоретического предела, небольшое улучшение перед простой суммой. Алгоритм в таком виде не имеет смысла. В данном случае теряется важная информация из отбрасываемых старших 8..16 бит, а их необходимо учитывать. Проще всего, смешать функцией XOR с младшими битами 1..8. Приходим к еще более интенсивной модификации контрольной суммы, желательно с минимальным затратами ресурсов. Добавляем фокус из криптографических алгоритмов
Проверяем: Результат 91% от теоретического предела. Вполне годится для применения. Если в микроконтроллере нет блока умножения, можно имитировать умножение операций сложения, смещения и XOR. Суть процесса такая же, модифицированный ошибкой бит, равномерно «распределяется» по остальным битам контрольной суммы. На удивление хороший результат. Среднее значение 254,5 или 99% от теоретического предела, операций немного больше, но все они простые и не используется умножение. Если для внутреннего хранения промежуточных значений контрольной суммы отдать 16 бит переменную (но передавать по линии связи будем только младшие 8 бит), что не проблема даже для самого слабого микроконтроллера, получим некоторое улучшение работы алгоритма. В целом экономить 8 бит нет особого смысла, и 8-битовая промежуточная переменная использовалась ранее просто для упрощения понимания работы алгоритма. Что соответствует 100.6% от теоретического предела, вполне хороший результат для такого простого алгоритма из одной строчки: Используется полноценное 16-битное умножение. Опять же не обошлось без магического числа 44111 (выбрано из общих соображений без перебора всего подмножества чисел). Более точно, константу имеет смысл подбирать, только определившись с предполагаемым типом ошибок в линии передачи данных. Столь высокий результат объясняется тем, что 2 цикла умножения подряд, полностью перемешивают биты, что нам и требовалось. Исключением, похоже, является последний байт телеграммы, особенно его старшие биты, они не полностью замешиваются в контрольную сумму, но и вероятность того, что ошибка придется на них невелика, примерно 4%. Эта особенность практически ни как не проявляется статистически, по крайней мере на моем наборе тестовых данных и ошибке ограниченной 10 сбойными битами. Для исключения этой особенности можно делать N+1 итераций, добавив виртуальный байт в дополнение к имеющимся в тестовом блоке данных (но это усложнение алгоритма). Вариант без умножения с аналогичным результатом. Переменная CRC 16-битная, данные 8-битные, результат работы алгоритма — младшие 8 бит найденной контрольной суммы: Результат 100.6% от теоретического предела. Вариант без умножения более простой, оставлен самый минимум функций, всего 3 математических операции: Результат 86% от теоретического предела. В этом случае потери старших бит нет, они возвращаются в младшую часть переменной через функцию XOR (битовый миксер). Небольшое улучшение в некоторых случаях дает так же:
Результат работы рассмотренных алгоритмов, от простых и слабых, к сложным и качественным: 16-битная контрольная суммаДалее, предположим что нам мало 8 бит для формирования контрольной суммы. Следующий вариант 16 бит, и теоретическая вероятность ошибки переданных данных 1:65536, что намного лучше. Надежность растет по экспоненте. Но, как побочный эффект, растет количество вспомогательных данных, на примере нашей телеграммы, к 8 байтам полезной информации добавляется 2 байта контрольной суммы. Простые алгоритмы суммы и XOR, применительно к 16-битной и последующим CRC не рассматриваем вообще, они практически не улучают качество работы, по сравнению с 8-битным вариантов. Модифицируем алгоритм для обработки контрольной суммы разрядностью 16 бит, надо отметить, что тут так же есть магическое число 8 и 44111, значительное и необоснованное их изменение ухудшает работу алгоритма в разы. Что соответствует 109% от теоретического предела. Присутствует ошибка измерений, но это простительно для 10 млн. итераций. Так же сказывается алгоритм создания, и вообще тип ошибок. Для более точного анализа, в любом случае нужно подстраивать условия под ошибки в конкретной линии передачи данных. Дополнительно отмечу, что можно использовать 32-битные промежуточные переменные для накопления результата, а итоговую контрольную сумму использовать как младшие 16 бит. Во многих случаях, при любой разрядности контрольной суммы, так несколько улучшается качество работы алгоритма. 32-битная контрольная суммаПерейдем к варианту 32-битной контрольной суммы. Появляется проблема со временем отводимым для анализа статистических данных, так как число переданных телеграмм уже сравнимо с 2^32. Алгоритм такой же, магические числа меняются в сторону увеличения За 10 млн. итераций ошибка не обнаружена. Чтобы ускорить сбор статистики обрезал CRC до 24 бит: Результат, из 10 млн. итераций ошибка обнаружена 3 раза Вполне хороший результат и в целом близок к теоретическому пределу для 24 бит контрольной суммы (1:16777216). Тут надо отметить что функция контроля целостности данных равномерно распределена по всем битам CRC, и вполне возможно их отбрасывание с любой стороны, если есть ограничение на размер передаваемой CRC. Для полноценных 32 бит, достаточно долго ждать результата, ошибок просто нет, за приемлемое время ожидания. Вариант без умножения: Сбоя для полноценной контрольной суммы дождаться не получилось. Контрольная сумма урезанная до 24 бит показывает примерно такие же результаты, 8 ошибок на 100 млн. итераций. Промежуточная переменная CRC 64-битная. 64-битная контрольная суммаНу и напоследок 64-битная контрольная сумма, максимальная контрольная сумма, которая имеет смысл при передачи данных на нижнем уровне: Дождаться ошибки передачи данных, до конца существования вселенной, наверное не получится 🙂 Метод аналогичный тому, какой применили для CRC32 показал аналогичные результаты. Больше бит оставляем, выше надежность в полном соответствии с теоретическим пределом. Проверял на младших 20 и 24 битах, этого кажется вполне достаточным, для оценки качества работы алгоритма. Так же можно применить для 128-битных чисел (и еще больших), главное подобрать корректно 128-битные магические константы. Но это уже явно не для микроконтроллеров, такие числа и компилятор не поддерживает. КомментарииВ целом метод умножения похож на генерацию псевдослучайной последовательности, только с учетом полезных данных участвующих в процессе. Рекомендую к использованию в микроконтроллерах, или для проверки целостности любых переданных данных. Вполне рабочий метод, уже как есть, не смотря на простоту алгоритма. Мой проект по исследованию CRC на гитхаб. Далее интересно было бы оптимизировать алгоритм на более реальных данных (не псевдослучайные числа по стандартному алгоритму), подобрать более подходящие магические числа под ряд задач и начальных условий, думаю можно еще выиграть доли процента по качеству работы алгоритма. Оптимизировать алгоритм по скорости, читаемости кода (простоте алгоритма), качеству работы. В идеале получить и протестировать образцы кода для всех типов микроконтроллеров, для этого как-раз и нужны примеры с использованием умножения 8, 16, 32 битных данных, и без умножения вообще. Источник |