Проект шифрования: нужен совет о том, как устранить издержки метода - PullRequest
1 голос
/ 13 мая 2011

Я ищу совет. Я разработал свои собственные алгоритмы шифрования, потому что мне это нравится, и я могу. Сейчас я ищу новую идею.

Моя идея заключается в объединении ряда моих алгоритмов в один больший. Например, вы вызываете X.Encrypt(), тогда он использует A.Encrypt(), B.Encrypt(), C.Encrypt() и т. Д. Когда вы выполняете операцию такого рода по одному байту на A, B, C, вызовите метод служебной информации становится убийцей Переход от нескольких мс до нескольких минут. Итак, есть вопросы?

Я просто ищу советы и рекомендации по дизайну кода, чтобы уменьшить проблему.

Спасибо заранее.

Обновление

Пример кода выпуска:

//fast
moduleA.Transform(true, buffer, 0, buffer.Length);
moduleB.Transform(true, buffer, 0, buffer.Length);

//slow
for (int L = 0; L < buffer.Length; )
{
    moduleA.Transform(true, buffer, L++, 1);
    moduleB.Transform(true, buffer, L++, 1);
}

Я знаю, что эта проблема присуща тому, как ее называют. Моя цель - изменить то, как я это делаю. Я знаю, что внутри методов Transform может быть улучшение. Быстрый работает примерно за 24 секунды, а медленный занимает много минут. Очевидно, что накладные расходы от методов, профилировщик не требуется:)

У меня есть идея, которую я собираюсь попробовать. Я думаю об использовании «режимов работы», в которых я вместо циклического выполнения вне методов Transform я изменяю способ его выполнения внутри каждого метода в соответствии со своими потребностями. Итак, я мог бы выполнять шифрование всех остальных байтов, выполняемое внутри методов Transform и в виде пакета. Я считаю, что это устранит накладные расходы, которые я получаю.

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ (Решил мою собственную проблему, все еще открытую для идей!)

Увеличение скорости цикла внутри метода Transform сработало!

Я сделал следующее, и похоже, что он работает хорошо:

ITransformationModule moduleA = TransformationFactory.GetModuleInstance("Subspace28");
ITransformationModule moduleB = TransformationFactory.GetModuleInstance("Ataxia");
moduleA.IncrementInterval = 2;
moduleB.IncrementInterval = 2;
moduleA.Transform(true, buffer, 0, buffer.Length);
moduleB.Transform(true, buffer, 1, buffer.Length);

Это работает около 12 секунд для 100 МБ на моей рабочей виртуальной машине. Спасибо всем, кто внес свой вклад! Это была комбинация ответа, которая помогла мне попробовать это таким образом. Я очень ценю вас всех!

Это просто доказательство концепции на данный момент. Это строит навстречу великим вещам! :)

Ответы [ 5 ]

2 голосов
/ 13 мая 2011

Зашифровываете ли вы данные, вызывая методы побайтно? Почему бы не вызвать метод на порции данных и выполнить цикл внутри этого метода? Кроме того, хотя определенно интересно попробовать свои собственные методы шифрования, вы должны всегда использовать известный, проверенный и безопасный алгоритм, если безопасность вообще вызывает беспокойство.

0 голосов
/ 13 мая 2011

Хотелось бы что-нибудь подобное?Конечно, вам придется изменить его так, чтобы он соответствовал вашим аргументам шифрования и типам возвращаемых значений ....

static class Encryptor
{
    delegate void Transform(bool b, byte[] buffer, int index, int length);
    static Transform[] transformers = new Transform[3];

    static Encryptor()
    {
        transformers[0] = (b, buffer, index, length) => { /*Method A*/ };
        transformers[1] = (b, buffer, index, length) => { /*Method B*/ };
        transformers[2] = (b, buffer, index, length) => { /*Method C*/ };
    }

    public static void Encrypt(bool b, byte[] buffer)
    {
        int length = buffer.Length;
        int nTransforms = transformers.Length;
        for (int i = 0; i < length;)
        {
            for (int j = 0; j < nTransforms; j++)
            {
                transformers[i % nTransforms](b, buffer, i++, 1);
            }
        }
    }
}

Редактировать Так что это будет сделано во втором примере

Encryptor.Encrypt(yourBoolean, yourBuffer);

Я не знаю специфики вашей реализации, но не должно быть проблем с накладными расходами.

0 голосов
/ 13 мая 2011

Сначала профилируйте ваш код, чтобы вы знали, где вы должны действовать в первую очередь, а затем спросите снова:)

0 голосов
/ 13 мая 2011

Вы хотите, чтобы методы класса X вызывались из классов A, B, C, D, E, F, G и т. Д. ... без накладных расходов на вызов метода.Сначала это кажется абсурдным.Вы можете найти способ сделать это, используя System.Reflection.Emit .То есть динамически создайте метод, который выполняет A + B + C + D + E + F + G, а затем вызовите его.

0 голосов
/ 13 мая 2011

Вы можете попытаться реализовать свой алгоритм так, чтобы ваш код имел значение chunky calls, а затем chatty calls.То есть, вместо того, чтобы вызывать функции сто раз, вы можете иметь меньше вызовов функций, так что у каждой функции будет больше работы.Это один совет, вам, возможно, придется сделать свой алгоритм также эффективным, чтобы он не требовал значительных ресурсов процессора.Надеюсь, это поможет.

...