Обычно хеш-функция не является инъективной. Средства
что для любого значения a чаще всего встречаются first1 и first2
такой что:
a = hash(first1)
a = hash(first2)
Так что нельзя сказать наверняка, что было аргументом
хэш-функция Но так как хеш должен быть маленьким
значение, которое можно легко использовать в поиске и т. д.
дает некоторую информацию о области аргументов.
Если вам нужен хеш, который трудно сделать задом наперед
Отчисления на аргумент, вы должны использовать дайджест.
Дайджест, как правило, представляет собой значение, сгенерированное некоторой криптографической
Алгоритм и практически невозможно сделать
выводы о аргументации.
Полагаю, предикаты term_hash / 2 или около того обычно встречаются в
Системы Prolog квалифицируются как хэш, а не как дайджест. Но
Вы также можете легко реализовать собственную хеш-функцию. Что-то
вдоль линий:
my_hash(X,N) :- atom(X), !, atom_codes(X,L), my_hash_codes(L,N).
my_hash(X,N) :- X=..[F|L], my_hash(F,M), my_hash_args(L,R), my_hash_codes([M|R],N).
my_hash_codes([],0).
my_hash_codes([X|Y],N) :- my_hash_codes(Y,M), N is (X+M*31) mod 65531.
my_hash_args([],[]).
my_hash_args([X|Y],[M|N]) :- my_hash(X,M), my_hash_args(Y,N).
Предикат помощника my_hash_codes / 2 отправляет список чисел новому
число. Предикат помощника my_hash_args / 2 вычисляет хэш каждого
элемент списка и создает новый список. Предикат my_hash работает для
атомы и соединения, но это также может быть расширен до чисел.
Bye