Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog:md5谓词_Prolog_Md5_Swi Prolog - Fatal编程技术网

Prolog:md5谓词

Prolog:md5谓词,prolog,md5,swi-prolog,Prolog,Md5,Swi Prolog,我正在尝试编写一个md5谓词来验证以下内容: md5("my string", "my md5"). 这种谓词的一个真值实例是 md5("long live and prosper", "bf1835ce984d2a97d31409394fe00e9a"). 我查看了文档,发现了以下内容: 无论如何,我不能让它工作。我确信我遗漏了一些东西,因为我在prolog中是新手。有什么提示吗 编辑 为了更好地解释,我假设创建一个类似于以下内容的子句: md5(P, M):- phrase("$1

我正在尝试编写一个
md5
谓词来验证以下内容:

md5("my string", "my md5").
这种谓词的一个真值实例是

md5("long live and prosper", "bf1835ce984d2a97d31409394fe00e9a").
我查看了文档,发现了以下内容:

无论如何,我不能让它工作。我确信我遗漏了一些东西,因为我在prolog中是新手。有什么提示吗

编辑

为了更好地解释,我假设创建一个类似于以下内容的子句:

md5(P, M):-
   phrase("$1$", E, _),
   crypt(P, E),
   name(M, E),
   format('~s~n', [E]).

?- md5("long live and prosper", "bf1835ce984d2a97d31409394fe00e9a").
   $1$AtnbRJvB$cZ4gZvG2Glelv8hfWztcY/
   false.
谢谢


(Prolog实现:Mac OSX El Capitan上的swi Prolog)

尽管不推荐使用,但您正在寻找的功能是


在SWI序言中,还有

:从序言计算MD5哈希 一串这是一个相当短期的解决方案,等待一个更长远的解决方案 OpenSSL的libcrypto函数的通用接口

(本文件的一个分章是)

这在中,必须使用
use\u模块(库(md5))加载它。

。。。不幸的是,这对我的Fedora 24不起作用。RPM包似乎不完整。没有文件
/usr/lib64/swipl-7.2.3/library/md5.pl
,实际上:

?- use_module(library(md5)).
ERROR: source_sink `library(md5)' does not exist
为什么

另一方面,我们有模块“sha”(
/usr/lib64/swipl-7.2.3/library/sha.pl
)。因为我只需要一个散列值,这似乎足够好了:

字体图书馆 库(sha)提供FIPS(联邦)批准的安全哈希算法 信息处理标准)

好的,那么:

?- use_module(library(sha)).
true.

?- sha_hash("Beyond the Aquila Rift",H,[algorithm(sha256),encoding(utf8)]),hash_atom(H,Hex).
H = [122, 123, 130, 89, 90, 210, 207, 106, 48|...],
Hex = '7a7b82595ad2cf6a30c2ee66672f53e0d630d4c8742d914e73c6761edc9186d2'.

?- sha_hash("Beyond the Aquila Rift",H,[algorithm(sha1),encoding(utf8)]),hash_atom(H,Hex).
H = [7, 152, 27, 81, 140, 122, 225, 76, 238|...],
Hex = '07981b518c7ae14cee70563d87d56db53656232c'.

讨厌

嗯,我的解释很糟糕。我的意思是,我假设这个代码片段是从“长寿和繁荣”生成“bf1835ce984d2a97d31409394fe00e9a”,但它不是(当然,我用我的短语而不是“我的密码”)。谢谢你通知我,我将编辑我的问题。现在清楚了吗?@Boris谢谢,我用我的shellBrilliant的全部输入和输出更新了这个问题!您还可以解释为什么rdf_atom_md5(“万岁,繁荣昌盛”,1,'bf1835ce984d2a97d31409394fe00e9a')会起作用吗。虽然这个rdf_atom_md5(“长寿和繁荣”,1,“bf1835ce984d2a97d31409394fe00e9a”)没有,但它在参数处理方面是不对称的。给定名称,谓词将期望原子作为第一个参数,原子作为最后一个参数,但是第一个参数的类型被放宽,以接受几个有用的表示。输出固定为atom,不使用字符串统一。
?- use_module(library(md5)).
ERROR: source_sink `library(md5)' does not exist
?- use_module(library(sha)).
true.

?- sha_hash("Beyond the Aquila Rift",H,[algorithm(sha256),encoding(utf8)]),hash_atom(H,Hex).
H = [122, 123, 130, 89, 90, 210, 207, 106, 48|...],
Hex = '7a7b82595ad2cf6a30c2ee66672f53e0d630d4c8742d914e73c6761edc9186d2'.

?- sha_hash("Beyond the Aquila Rift",H,[algorithm(sha1),encoding(utf8)]),hash_atom(H,Hex).
H = [7, 152, 27, 81, 140, 122, 225, 76, 238|...],
Hex = '07981b518c7ae14cee70563d87d56db53656232c'.