Я хочу эмулировать машину Enigma, поэтому мне нужно эмулировать электрический сигнал.
Если вы не знакомы с Enigma, вот как это работает: электрический сигнал проходит от платы через скраблеры. Скребки вращаются, поэтому путь сигнала меняется (выходной отличается).
До сих пор я делал это так (это упрощенный код):
for (int i = 0; i < data.length; i++)
{
for (int j = 0; j < key.Length; j++)
{
// encrypting
data[i] = scramblers[j][(byte)(data[i] + key[j])];
}
for (int j = 0; j < key.Length; j++)
{
// rotating scramblers
key[j]++;
if (key[j] != 0) break;
}
}
Как видите, я использовал входные (не зашифрованные) данные в качестве индекса массива (соединение скремблера). Вывод (зашифрованные данные) является содержимым массива (скремблер).
Проблема в том, что когда вы помещаете в очередь немного больше скремблеров подряд (например, 100 000), это очень и очень медленно. Поэтому я подумал, что должен быть способ оптимизировать эту часть (может быть, как-нибудь с помощью указателей или связанного массива?).
Этот код в настоящее время написан на C #, и я знаю, что для лучшей оптимизации его следует переписать на C и C ++, но давайте просто оставим это сейчас.
Мой вопрос: как я могу оптимизировать код, показанный выше для его цели (если вообще возможно)?