Вот более быстрая версия Отличный ответ Эргвуна :
static int SearchBytes( byte[] haystack, byte[] needle ) {
var len = needle.Length;
var limit = haystack.Length - len;
for( var i = 0; i <= limit; i++ ) {
var k = 0;
for( ; k < len; k++ ) {
if( needle[k] != haystack[i+k] ) break;
}
if( k == len ) return i;
}
return -1;
}
В кратком тесте со стогом сена 11 МБ и иглой 9 байтов это было примерно в три раза быстрее.
Оптимизация:
- Нет вызова функции каждый раз через внешний цикл.
- Кэшируется длина иглы и предел поиска.
- Удалено избыточное испытание длины в начале
match()
.
Конечно, для длинных байтовых массивов вы хотели бы использовать что-то вроде поиска Бойера-Мура, но для многих целей простой алгоритм, подобный этому, достаточно хорош, и он имеет преимущество в том, что он короткий и легкий для понимания и проверки. .