我是Prolog的新手,我想知道我们可以在Prolog中实现这个:
a = hash(first).
而且,知道first
的人可以计算a
,但知道a
的人无法计算first
。
答案 0 :(得分:1)
典型的散列函数通常不是单射的。手段 对于任何值,最常见的是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的谓词适用于 原子和化合物,但它也可以扩展到数字。
再见