Реализация хеш-функции в прологе - PullRequest
1 голос
/ 14 февраля 2011

Я новичок в Прологе, и я хочу знать, можем ли мы реализовать это в Прологе:

a = hash(first).

И тот, кто знает first, может вычислить a, но тот, кто знает a не могу рассчитать first.

1 Ответ

1 голос
/ 13 апреля 2011

Обычно хеш-функция не является инъективной. Средства что для любого значения 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

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