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'.