Чтобы развить блестящее решение user2357112 и сократить цепочку комментариев, давайте рассмотрим ваши требования один за другим (и не по порядку):
Технически это не хэш-функция. Хеш-функция предназначена для отображения разнородных входных данных произвольной длины в однородные выходные данные фиксированной ширины. Единственный способ сделать это, если ввод длиннее вывода, - это потеря данных. Для большинства приложений это допустимо, потому что хэш-функция используется только как ключ быстрого поиска, а код возвращается к более медленному полному сравнению данных. Вот почему многие руководства и языки утверждают, что если вы реализуете одно, вы должны реализовать и другое.
К счастью, вы говорите:
- Два входа UUID m и n
- UUID имеют длину 128 бит каждый.
- Выходные данные f(m,n) должны быть 256 бит или меньше.
Объединение ваших двух входов составляет ровно 256 бит, что означает, что вам не нужно терять данные. Если вам нужен меньший выход, то вам не повезло. Как бы то ни было, вы можете соединить два числа вместе и создать идеальное уникальное представление.
- f(m,n) и f(n,m) должны генерировать один и тот же хеш.
Чтобы выполнить это последнее требование, примите решение о порядке конкатенации по некоторому внутреннему значению двух UUID. Предлагаемый вариант меньшего размера работает просто отлично. Тем не мение...
- Хэш не обязательно должен быть обратимым
Если вам конкретно нужно необратимое хеширование, это совсем другой вопрос. Вы по-прежнему можете использовать сравнение «меньше чем», чтобы обеспечить независимость от порядка при подаче на криптографическую хеш-функцию, но вам будет трудно найти что-то, что гарантирует отсутствие коллизий даже при фиксированной ширине входных данных и 256-битной выходной ширине.
person
Patrick M
schedule
22.04.2015