Расширение ответа C.Evenhuis, вот некоторые варианты, которые должны быть довольно быстрыми. Я не уверен, что из-за их правильности, кто-нибудь с большим опытом работы хочет помочь мне? Я знаю, что они не дают той же контрольной суммы, что и для каждого байта, но я действительно думаю, что они дают контрольную сумму, которая равна хорошим (не очень, но явно достаточным) в качестве байтового.
Как я уже сказал в комментарии, вы можете значительно улучшить скорость, не сравнивая байт за байт, но рассматривая массив как в 4 раза меньшем массиве ints или в 8 раз меньшем массиве длин. Рассмотрение этого вопроса как long[]
дает только преимущество в производительности на 64-битном уровне.
static unsafe uint ChecksumInt(byte[] array)
{
unchecked
{
uint checksum = 0;
fixed (byte* ptr = array)
{
var intPtr = (uint*)ptr;
var iterations = array.Length/4;
var remainderIterations = array.Length % 4;
for (var i = 0; i < iterations; i++)
{
var val = intPtr[i];
checksum += val;
}
while (remainderIterations >= 0) // no more than 3 iterations
{
checksum += ptr[array.Length - remainderIterations];
remainderIterations--;
}
return checksum;
}
}
}
static unsafe ulong ChecksumLong(byte[] array)
{
unchecked
{
ulong checksum = 0;
fixed (byte* ptr = array)
{
var intPtr = (ulong*)ptr;
var iterations = array.Length/8;
var remainderIterations = array.Length % 8;
for (var i = 0; i < iterations; i++)
{
var val = intPtr[i];
checksum += val;
}
while (remainderIterations >= 0) // no more than 7 iterations
{
checksum += ptr[array.Length - remainderIterations];
remainderIterations--;
}
return checksum;
}
}
}
Мои измерения производительности на 64-разрядных (Core 2 Duo 3 ГГц) для массива 100000 элементов более 10000 итераций:
- За 1 байт: 00: 00: 00,7052533
- Пер 4 байта: 00: 00: 00,1761491
- За 8 байт: 00: 00: 00,0856880
Так совсем немного быстрее.
Но, как я уже сказал, я не знаю точно, обеспечит ли он такую же хорошую контрольную сумму.
Большинство контрольных сумм необходимо будет пропустить через каждый байт, и это действительно медленная часть. Операции, выполняемые для каждого байта, обычно не особенно дороги. Если у вас возникают реальные проблемы, попробуйте реализовать несколько алгоритмов и профилировать их, чтобы узнать, что быстрее, и если вы достаточно быстро для вас. – Servy
Каждый байтовый массив, однако, заканчивается множеством нулевых байтов, однако некоторые из них этого не делают. У некоторых это замедляется или есть какой-то быстрый способ снять их? – Tgys
Взгляните на [crc-32] (http://en.wikipedia.org/wiki/Crc32) – Reniuz