ОК, поэтому я нашел метод, который, кажется, работает довольно хорошо.Это не обязательно очень эффективно, но каждый тест все еще выполняется примерно за полсекунды, так что это хорошо для моей цели.Размещать его здесь на случай, если это поможет кому-то другому.
В основном он просто суммирует байты в каждом массиве и вычисляет разницу:
public static bool IsAnalogousTo(this byte[] left, byte[] right, int tolerance)
{
long leftSum = 0;
foreach (var b in left)
{
leftSum += b;
}
long rightSum = 0;
foreach (var b in right)
{
rightSum += b;
}
return Math.Abs(leftSum - rightSum) < left.Length / tolerance;
}
Я думаю, что файлы имеют размер ~ 115kразмер - если сумма всех байтов в файлах такого размера меньше, чем ~ 15k, то это означает, что менее одного бита на каждые десять байтов (параметр допуска) отличается.
Это хорошо работает для того, что яхочу.Для других целей, где требуется большая точность, вероятно, было бы лучше сделать это порциями, чтобы убедиться, что области файла похожи.
Конечно, для небольшого набора данных это было бы бесполезно.Было бы сказано, что [10, 20, 30, 40] и [0, 0, 0, 100] одинаковы, но на 115 000 байтов разумно структурированных данных, таких как PDF, я думаю, что это, вероятно, приемлемо.