0


0

LINQを使用してバイトを一緒にXORする

LINQ toを使用して配列内のバイトを一緒に「XOR」するにはどうすればよいですか? MD5ハッシュの出力を取得し、4バイトごとに「XOR」を実行して、32ビットの「int」を取得できるようにします。 ループでこれを簡単に行うことができましたが、LINQにとって興味深い問題だと思いました。

public static byte[] CompressBytes(byte[] data, int length)
{
    byte[] buffer = new byte[length];
    for (int i = 0; i < data.Length; i++)
    {
        for (int j = 0; j < length; j++)
        {
            if (i * length + j >= data.Length)
                break;
            buffer[j] ^= data[i * length + j];
        }
    }
    return buffer;
}

'' '' '

少し話題から外れていますが、これは良いアイデアでしょうか? 「int」が必要な場合、別のハッシュ関数を使用した方が良いでしょうか、それとも「XOR」を実行しても役に立たないため、MD5の最初の4バイトを使用する必要がありますか? コメントは大歓迎です。

2 Answer


1


http://msdn.microsoft.com/en-us/library/bb548651.aspx [IEnumerable.Aggregate]関数を使用できます(実際にはLINQではありませんが、ほとんどの人はLINQ関連の拡張メソッドをLINQと呼びます)カスタム集計を実行します。 たとえば、次のように「バイト」のリストの合計XORを計算できます。

var xor = list.Aggregate((acc, val) => (byte)(acc ^ val));

拡張メソッド呼び出しの事実上読み取り不可能なチェーンを作成して、目的のことを行うことができます。

int integer = BitConverter.ToInt32(Enumerable.Range(0, 3).
              Select(i => data.Skip(i * 4).Take(4).
                  Aggregate((acc, val) => (byte)(acc ^ val))).ToArray(), 0)


0


「オフトピック」の部分に対処するには、MD5ハッシュの最初の32ビットを削除することをお勧めします。 または、http://nitokitchensink.codeplex.com/SourceControl/changeset/view/54131#1012328 [CRC32]などの単純な非暗号化ハッシュを検討してください。

他の暗号化ハッシュと同様に、MD5は可能な限りランダムに表示されるようになっているため、他のバイトのXOR演算は実際には違いを生じません、IMO。