使用LINQ将字节排在一起

时间:2010-07-02 18:08:06

标签: c# linq

如何在阵列中一起使用LINQ到XOR个字节?我正在获取MD5哈希的输出,并希望每四个字节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,我会更好地使用不同的哈希函数,或者我应该只采用MD5的前4个字节,因为XOR它们都不会有任何帮助吗?欢迎提出意见。

2 个答案:

答案 0 :(得分:2)

您可以使用IEnumerable.Aggregate函数(实际上不是LINQ,但大多数人将LINQ相关的扩展方法称为LINQ)来执行自定义聚合。例如,您可以像这样计算byte列表的总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)

答案 1 :(得分:0)

为了解决“非主题”部分,我建议只删掉MD5哈希的前32位。或者考虑更简单的非加密哈希,例如CRC32

与其他加密哈希值一样,MD5应该尽可能随机出现,因此异或其他字节不会产生任何影响,IMO。