Ваш файл содержит символы новой строки, которые также являются невидимыми символами. Например:
test|example;(newline here)
example|test;
Вы разделяете строки в своем файле, используя ;
, но это не удаляет символы новой строки. Принимая во внимание комментарии в вашем вопросе, в ваших результатах появляются новые строки, которые приводят к сбою сравнений. Тем не менее, я предлагаю следующее решение сразу после загрузки хешей для удаления символов новой строки:
$hashes = preg_replace("/[\r\n]/", "", $hashes);
, что приведет к такой строке:
test|example;example|test;
Остальная часть вашего кода будет работать как положено.