1

アドバイスを求めています。私はそれを楽しんでできるので、独自の暗号化アルゴリズムを開発しました。今、私は新しいアイデアを試してみようとしています。

私のアイデアには、いくつかのアルゴリズムをより大きなものに統合することが含まれます。たとえば、 を呼び出して、、などX.Encrypt()を使用します。この種の操作を実行すると、 、、メソッド呼び出しごとに 1 バイトのメソッド オーバーヘッドが致命的になります。数ミリ秒から数分になります。質問はありますか?A.Encrypt()B.Encrypt()C.Encrypt()ABC

問題を軽減するためのコード設計のヒントとコツを探しているだけです。

ありがとうございます。

アップデート

問題のコード例:

//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 メソッド内でバッチとして実行される 1 バイトおきの暗号化を実行できます。これにより、私が得ているオーバーヘッドが解消されると思います。

最終更新 (私自身の問題を解決しましたが、まだアイデアを受け入れています!)

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);

これは、私の作業用 VM で 100MB の場合、約 12 秒で実行されます。貢献してくれた皆さん、ありがとう!このように試すようになったのは、さまざまな反応の組み合わせでした。皆さんに感謝します!

これは現時点での概念実証にすぎません。それはより大きなものに向かって構築されています!:)

4

5 に答える 5

2

バイトごとにメソッドを呼び出してデータを暗号化していますか?データのチャンクでメソッドを呼び出し、そのメソッド内でループしてみませんか?また、独自の暗号化方式を試すことは間違いなく楽しいですが、セキュリティがまったく懸念される場合は、ほとんどの場合、既知のテスト済みの安全なアルゴリズムを使用する必要があります。

于 2011-05-13T18:16:08.520 に答える
0

コードがchunky calls次にchatty calls. つまり、関数を何百回も呼び出す代わりに、関数呼び出しを少なくして、各関数がより多くの作業を行うことができます。これは 1 つのアドバイスです。プロセッサを集中的に使用しないように、アルゴリズムを効率的にする必要がある場合があります。この助けを願っています。

于 2011-05-13T18:13:12.723 に答える
0

このようなものは機能しますか?もちろん、暗号化引数と戻り値の型に合わせて変更する必要があります....

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);
            }
        }
    }
}

編集これで2番目の例が実行されます

Encryptor.Encrypt(yourBoolean, yourBuffer);

実装の詳細はわかりませんが、オーバーヘッドの問題はないはずです。

于 2011-05-13T18:36:16.500 に答える
0

クラス X で、クラス A、B、C、D、E、F、G などからメソッドを呼び出す必要があります。メソッド呼び出しのオーバーヘッドはありません。最初は、それはばかげているように思えます。System.Reflection.Emitを使用してそれを行う方法を見つけることができるかもしれません。つまり、A+B+C+D+E+F+G を実行するメソッドを動的に作成し、それを呼び出します。

于 2011-05-13T18:14:07.787 に答える
0

最初にコードをプロファイリングして、最初に操作する場所がわかるようにしてから、もう一度質問してください:)

于 2011-05-13T18:20:50.327 に答える