如何在阵列中一起使用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
它们都不会有任何帮助吗?欢迎提出意见。
答案 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。