Prolog中的哈希函数实现

时间:2011-02-14 11:58:55

标签: prolog

我是Prolog的新手,我想知道我们可以在Prolog中实现这个:

a = hash(first).

而且,知道first的人可以计算a,但知道a的人无法计算first

1 个答案:

答案 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的谓词适用于 原子和化合物,但它也可以扩展到数字。

再见