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