Мне нужен способ сопоставить некоторый печатный текст с другим печатным текстом. Например.:
Ян Бойд
✓ ККП Збас
Обратите внимание на некоторые важные требования:
- верхний регистр в выводе в верхнем регистре
- строчные буквы на входе строчные буквы на входе
- пробелы (и все остальное за пределами A-Z0-9) оставляются в покое
Дополнительным требованием является наличие детерминированный, то есть один и тот же ввод всегда дает один и тот же вывод:
Ян Бойд
✓ ККП Xbas
Ян Бойд
✓ ККП Xbas
Ян Бойд
✓ ККП Xbas
Другое требование расширяет детерминизм, и я не знаю, как его назвать, кроме как сказать, что слова с общими префиксами должны иметь одинаковый вывод для одного и того же общего префикса:
я
✓ К
Я
✓ Кс
Ян
✓ Kcp
Ян
✓ Kcp
Ян Б
✓ Kcp X
Ян Бо
✓ Kcp Xb
Ян Бой
✓ ККП Хба
Ян Бойд
✓ Kcp Xbap
Мое решение
Я создал решение этих технических требований 15 лет назад; но я пытаюсь что-то пересмотреть "лучше".
Мое решение было "поточный шифр Цезаря с цепочкой".
Создайте простую замену Цезаря:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
F H U D I R Y E K C Z N S A B G J P V O W T L M Q X
Но вместо простой замены:
вместо этого я использовал цепочку:
Предыдущее состояние Текущая сумма символов (mod) Вывод следующего символа
----------------------------- ------------------ ---------- --------- ----- --------------------
0 Я (9) 9 К К
9 а (1) 10 в Кс
10 п (14) 24 п сп
24 Б (2) 26 Х Крп Х
26 о (15) 15 б Ксп Хб
15 лет (25) 14 a Kcp Xba
14 д (4) 18 м Kcp Xbap
Лучшее решение с хешированием?
Эти значения не то, что мне нужно (или хочу) "расшифровать", а использование шифра Цезаря предполагает возможность расшифровки (что, как мы все знаем, не так уж сложно).
Так что концептуально я действительно хочу "односторонняя функция": что-то, что:
- преобразует ввод
- к какому-то непредсказуемому результату
- детерминистически
Я подумал: а что, если бы я использовал алгоритм хеширования, добавляя буквы по одной и получая текущую "государство", и преобразуйте этот частичный дайджест в символ (верхний/нижний регистр/цифру в соответствии с вводом):
Строка FrobTheGrobber (ввод строки)
{
//доказательство концепции псевдокода, который обрабатывает только верхний регистр
Хэш HashAlgorithm = новый SHA256();
hash.AddBytes (SECRET_KEY);
Строка рез = "";
для Char ch на входе
{
хэш.Добавить(ch);
int charCode = (hash.Hash[0] % 26) + 1; //используем первый байт по модулю 26, чтобы получить значение от 0 до 25
res += Char(Ord('A') + charCode;
}
}
Я знаю; ты ненавидишь требования.
Может ли кто-нибудь придумать что-нибудь лучше?