使用LINQ对字节进行XOR运算

j7dteeu8  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(156)

如何使用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把它们都用上没有任何帮助?欢迎评论。

ebdffaop

ebdffaop1#

您可以使用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)
2vuwiymt

2vuwiymt2#

为了解决“离题”的部分,我建议去掉MD5哈希的前32位,或者考虑一个更简单的非加密哈希,比如CRC32。
像其他加密哈希一样,MD5应该尽可能随机地出现,所以异或其他字节不会真正有什么不同,IMO。

l3zydbqr

l3zydbqr3#

如果您需要2字节数组的异或:(x,i)=〉(x ^字节数组2 [i])).

相关问题