あなたのXOR-マスキングを行うための簡単な方法は、バイトである:
void encrypt(uint8_t* in, size_t len, const uint8_t key[8])
{
for (size_t i = 0; i < len; i++) {
in[i] ^= key[i % 8];
}
}
注:key
は、64ビットではなく8バイトの配列です。このコードは簡単です。トリックは必要なく、簡単にデバッグすることができます。パフォーマンスを測定し、パフォーマンスが十分であればそれを使用します。
一部の(ほとんどの)コンパイラは、このような単純なコードをベクトル化によって最適化します。つまり、すべての詳細(キャストuint64_t
など)はコンパイラによって実行されます。ただし、コード内で "賢明"にしようとすると、誤ってコンパイラが最適化を実行できなくなる可能性があります。だから簡単なコードを書くようにしてください。
P.S.おそらく、restrict
キーワードも使用してください。これは現在標準ではありませんが、最高のパフォーマンスを得るために必要な場合があります。私はそれを使用する経験がないので、私の例にそれを追加しませんでした。
あなたが悪いのコンパイラを持っている場合は、ベクトル化オプションを有効にするか、単に周りにプレイしたい、あなたは鋳造で、このバージョンを使用することができません。
void encrypt(uint8_t* in, size_t len, uint64_t key)
{
uint64_t* in64 = reinterpret_cast<uint64_t*>(in);
for (size_t i = 0; i < len/8; i++) {
in64[i] ^= key;
}
}
それはいくつかの制限があります。
- 長さを8で割り切れるようにする必要があります
- アライメントの合っていないポインタをサポートするプロセッサが必要です(x86についてはわかりません - おそらく動作します)
- コンパイラが悪く、パフォーマンスにつながる、これをベクトル化することを拒否することがあり
- Hurkylで述べたように、マスク内の8バイトの順序は、x86、リトルエンディアンに(明確ではないが、最下位バイトがマスクされます入力配列の最初のバイト)
このルートを使用するには、char []が正しく配置されていることを確認する必要があります。性能が他に必要となるまで、一度に1バイトずつ作業するのが安全です。 – ildjarn
あなたが達成したいものを正確に示すためには、少なくとも[minimal](http://stackoverflow.com/help/mcve)サンプルコードを追加してください。とにかくXORポインタバイトが必要なのはなぜですか? – Jezor
@ildjarnこれを数メガバイトにしようとしているので、パフォーマンスが重要です。 :/ – TheAbelo2