Как подсчитать MD5 хеш и SHA1 хеш для неупорядоченного конечного множества

Доброго времени суток.

Задача: реализовать метод hashMd5() для класса представляющей собой НЕ УПОРЯДОЧЕННОЕ конечное множество таким образом, чтобы он возвращал MD5 хеш. Метод hashMd5() должен выполнять то же контракт по отношению к методу equals(), что и hashcode().

В чем сложность: когда для некоторого Java объекта необходимо посчитать MD5 хеш, то его сперва преобразуют в массив байт с помощью ObjectOutputStream. Потом этот массив байт скармливают алгоритму вычисляющему MD5 хеш. Однако такой подход негодится при реализации hashode() для НЕ УПОРЯДОЧЕННЫХ множеств, т.к. (например) для двух равных множеств A={1,2,3} и B={1,3,2} будут получены разные массивы байт и следовательно рассчитаны разные MD5 хеши.

Вопрос: собственно, как можно решить поставленную задачу?


Ответы (1 шт):

Автор решения: Bakuard
  1. Создаем какую-нибудь коллекцию поддерживающую упорядоченный набор элементов(например, ArrayList).
  2. Наполняем её элементами из нашей неизменяемой коллекции.
  3. Сортируем элементы.
  4. Скармливаем отсортированную коллекцию объекту ObjectOutputStream.
  5. Из объекта ObjectOutputStream получаем массив байт.
  6. Скармливаем массив байт объекту MessageDigest и получаем на выходе нужный хеш.
→ Ссылка