Странное поведение хеширования MD5 - PullRequest
1 голос
/ 14 октября 2010

Я столкнулся со странной проблемой со следующим кодом, приведенный ниже код предполагает остановку после одной итерации, но она просто продолжается.Тем не менее, если я удалю последний "result_bytes = md5.ComputeHash (orig_bytes);"тогда это будет работать.Кто-нибудь сталкивался с подобной проблемой раньше?

MD5 md5;
            byte[] orig_bytes;
            byte[] result_bytes;
            Dictionary<byte[], string> hashes = new Dictionary<byte[], string>();

            string input = "NEW YORK";
            result_bytes = UnicodeEncoding.Default.GetBytes("HELLO");
 while (!hashes.ContainsKey(result_bytes))
            {
                md5 = new MD5CryptoServiceProvider();
                orig_bytes = UnicodeEncoding.Default.GetBytes(input);
                result_bytes = md5.ComputeHash(orig_bytes);

                hashes.Add(result_bytes, input);
                Console.WriteLine(BitConverter.ToString(result_bytes));
                Console.WriteLine(hashes.ContainsKey(result_bytes));

                result_bytes = md5.ComputeHash(orig_bytes);
            }

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Вы предполагаете, что байтовые массивы переопределяют Equals и GetHashCode для сравнения на равенство: они не делают. Они просто используют тест идентичности по умолчанию - поэтому без дополнительного назначения в конце вы просто проверяете, находится ли только что добавленный вами ключевой объект в словаре - что, конечно, так.

Одним из способов решения этой проблемы было бы сохранение обратимого строкового представления хеша (например, с использованием base64) вместо самого хеша. Или напишите свою собственную реализацию IEqualityComparer<byte[]> и передайте ее конструктору Dictionary, чтобы она использовала эту реализацию, чтобы найти хэш-код массивов байтов и сравнить их друг с другом.

Короче говоря: это не имеет ничего общего с MD5, и все, что связано с тем, что

Console.WriteLine(new byte[0].Equals(new byte[0]));

выведет False:)

2 голосов
/ 14 октября 2010

Когда вы переназначаете result_bytes на новое значение в последней строке, вы получаете новую ссылку на байтовый массив, который не равен значению в коллекции, поэтому hashes.ContainsKey возвращает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...