Есть серийник. Он весьма хорош собой. Однако присутствие в нем символов 1,l,L,O,o,0 может мешать его читабельности и путать пользователя. Готово уже все(генерация, проверка). Осталось чего -то сделать с такой строкой, чтоб удалять символы перечисленого типа при передаче пользователю, а потом восстанавливать и во время верификации использовать восстановленный вариант... Что то не шарю пока...
Re: Алгоритм исключающий символ с возможностью его востановл
От:
Аноним
Дата:
02.04.08 15:50
Оценка:
Здравствуйте, LexRema, Вы писали:
LR>Привет!
LR>Есть серийник. Он весьма хорош собой. Однако присутствие в нем символов 1,l,L,O,o,0 может мешать его читабельности и путать пользователя. Готово уже все(генерация, проверка). Осталось чего -то сделать с такой строкой, чтоб удалять символы перечисленого типа при передаче пользователю, а потом восстанавливать и во время верификации использовать восстановленный вариант... Что то не шарю пока...
Дык, две возможности всего. Не использовать в конечном алфавите сразу при генерации, или заменять на последовательность, которая гарантированно не встретится в результирующей строке.
Re: Алгоритм исключающий символ с возможностью его востановл
Здравствуйте, LexRema, Вы писали:
LR>Есть серийник. Он весьма хорош собой. Однако присутствие в нем символов 1,l,L,O,o,0 может мешать его читабельности и путать пользователя. Готово уже все(генерация, проверка). Осталось чего -то сделать с такой строкой, чтоб удалять символы перечисленого типа при передаче пользователю, а потом восстанавливать и во время верификации использовать восстановленный вариант... Что то не шарю пока...
Переформулируй задачу. Есть строка, закодированная с использованием символов 0..9A..Za..z. Нужно перекодировать её с использованием сокращённого набора символов. Например, можно рассматривать строку как число в одной системе счисления и нужно перевести в другую. Или завести esc-символ, например 'x'. Тогда из строки нужно исключить все 1, l, o, O, 0, x, а вместо них вставить xA, xB, xC, xD, xE, xF. Это проще, но строка может получиться чуть длиннее, чем в первом случае.
Делай что должно, и будь что будет
Re[2]: Алгоритм исключающий символ с возможностью его востан
SH>Переформулируй задачу. Есть строка, закодированная с использованием символов 0..9A..Za..z. Нужно перекодировать её с использованием сокращённого набора символов. Например, можно рассматривать строку как число в одной системе счисления и нужно перевести в другую. Или завести esc-символ, например 'x'. Тогда из строки нужно исключить все 1, l, o, O, 0, x, а вместо них вставить xA, xB, xC, xD, xE, xF. Это проще, но строка может получиться чуть длиннее, чем в первом случае.
Да... Именно... Но не пойдет. Ескапе — хорошо,но не красиво... Уже думал. Задача сформулирована именно так... И длина выхода должна быть та же
Re[3]: Алгоритм исключающий символ с возможностью его востан
Что сложного? Придумать алфавит, в котором нет проблемных букв? На:
ABCDEFGHJKLMNPQRSTUVWXYZ23456789
I,O,1,0 — исключены
итого ровно 32 знака. Очень удобно (степень 2).
Опять же, можно наплевать на регистр. Там, правда, L строчное похоже на цифру 1 и I заглавное — но это разруливается элементарно: знаки I, L, i, l, 1 считаются эквивалентными.
Закодировать число в 32-ричной системе — как нефиг делать.
Второй путь — это эскейпить проблемные символы.
Например, I,l,1,O,0,Z <--> ZA,ZB,ZC,ZD,ZE,ZF (Z выступает эскейпом).
Серийник становится переменной длины.
Перекуём баги на фичи!
Re[2]: Алгоритм исключающий символ с возможностью его востан
А>Дык, две возможности всего. Не использовать в конечном алфавите сразу при генерации, или заменять на последовательность, которая гарантированно не встретится в результирующей строке.
Ниже привели ещё один способ — считать схожие символы одинаковыми.
Кстати, для русскоязычного приложения есть ещё одна проблема — схожесть в написании русских и латинских букв (классический пример — MOCKBA).
Для решения этой проблемы можно первым символом серийника сделать какую-нибудь явно латинскую букву (типа L, F, D и т.п.), чтобы юзер сразу переключил раскладку клавы на нужный язык.
Re[3]: Алгоритм исключающий символ с возможностью его востан
Здравствуйте, andy1618, Вы писали:
А>>Дык, две возможности всего. Не использовать в конечном алфавите сразу при генерации, или заменять на последовательность, которая гарантированно не встретится в результирующей строке.
A>Ниже привели ещё один способ — считать схожие символы одинаковыми.
Это и есть "не использовать". А описанный способ -- просто метод получения редуцированного алфавита из "большого", привычного нам.
A>Кстати, для русскоязычного приложения есть ещё одна проблема — схожесть в написании русских и латинских букв (классический пример — MOCKBA). A>Для решения этой проблемы можно первым символом серийника сделать какую-нибудь явно латинскую букву (типа L, F, D и т.п.), чтобы юзер сразу переключил раскладку клавы на нужный язык.
А вот не факт что поможет Юзеры -- они разные бывают.