Код исправления ошибок

Для платежной системы, которая допускает банковские/телеграфные переводы, мне нужно надежно связать платежи с соответствующей учетной записью пользователя, для которой они предназначены. Для этого пользователь должен указать ссылочный номер перевода, который связан с его учетной записью.

Я хотел бы сгенерировать этот номер со встроенной избыточностью (дополнительными символами), чтобы я мог обнаруживать и исправлять до N следующих (вероятно, распространенных) ошибок:

  • Неправильный символ в последовательности (опечатка)
  • Замена двух символов (что, я думаю, равносильно двум неправильным)
  • Отсутствующий символ в последовательности
  • дополнительный символ в последовательности

Я немного поискал, и кажется, что коды Reed Solomon или BCH обычно используются для этого. Единственное, что я не смог найти, так это поддерживают ли они последний случай, т.е. лишние символы.

Кроме того, я хотел бы, чтобы в коде был режим отказа, в котором говорилось бы: «это так испорчено, я не могу это исправить», а не выдавал случайный «исправленный» результат. Я думаю, я мог бы сделать это, просто сгенерировав разреженные ссылочные номера и надеясь, что маловероятно, что он случайно наткнется на действительный, но я бы предпочел что-то вроде: «Я могу исправить до 5 ошибок, но если это больше 3, я сдаюсь».

Есть предположения? Спасибо!


person Markus A.    schedule 02.11.2012    source источник


Ответы (1)


Я пока не тратил так много времени на изучение этого вопроса, но я думаю, что придумал предварительный способ решения этой проблемы, который я буду использовать сейчас:

Я создам ссылочный номер учетной записи из алфавита из 32 символов. Этот алфавит я разделю на 2 набора по 16 символов, оптимизируя наборы, чтобы свести к минимуму вероятность того, что случайная опечатка даст букву из другого набора. Например, просто разделите клавиатуру пополам, используя буквы в рамке с углами [1], [4], [v], [z] для одного набора, а другие буквы в качестве другого набора.

Затем я буду использовать [14, 8, 7]16 код Рида-Соломона для кодирования 32-битного номера счета, который я сначала разделил на восемь 4-битных символов.

Полученное сообщение я превращу в номер ссылки, выбрав 1-й, 3-й, 5-й, ... символы из 1-й половины алфавита, а остальные из 2-й половины алфавита. Таким образом, я могу «повторно синхронизировать» ссылочный номер, если обнаружу какие-либо замененные, лишние или отсутствующие символы.

После повторной синхронизации код RS должен позволить мне исправить до 3 других опечаток, и если кто-то сделает больше ошибок, чем это, он заслуживает проблем с оплатой... :)

Я хотел бы услышать любые комментарии, которые могут быть у кого-либо по этому подходу.

person Markus A.    schedule 15.11.2012