2015-10-14 123 views
2

我想写一个md5谓词验证以下:序言:MD5谓词

md5("my string", "my md5"). 

这样的谓词的真实例是

md5("long live and prosper", "bf1835ce984d2a97d31409394fe00e9a"). 

我看着文档,和我发现这个:http://www.swi-prolog.org/pldoc/doc_for?object=crypt/2

?- phrase("$1$", E, _), 
    crypt("My password", E), 
    format('~s~n', [E]). 

无论如何,我无法得到它的工作。我确定我错过了一些东西,因为我在序言中很新颖。任何提示?

编辑

为了更好地解释,我想创建一个类似的条款:

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 SWI-序言OSX El Capitan)

+0

嗯,我的解释很差。我的意思是我假设这段代码从“万岁和繁荣”中生成“bf1835ce984d2a97d31409394fe00e9a”,但它不(当然,我用我的短语代替“我的密码”)。感谢您通知我,我会编辑我的问题。现在清楚吗? – balanza

+0

@Boris谢谢,我用我的外壳的全部输入和输出更新了这个问题 – balanza

回答

2

虽然不赞成,你要寻找的功能是available

?- use_module(library(semweb/rdf_db)). 
true. 

?- rdf_atom_md5("long live and prosper", 1, MD5). 
MD5 = bf1835ce984d2a97d31409394fe00e9a. 
+0

太棒了!你能解释一下为什么这么做吗? rdf_atom_md5(“long live and prosper”,1,'bf1835ce984d2a97d31409394fe00e9a')。 虽然这 rdf_atom_md5(“万岁和繁荣”,1,“bf1835ce984d2a97d31409394fe00e9a”) 不? – balanza

+1

这是参数处理中的不对称。给定名称后,谓词会期望一个原子作为第一个参数,并将一个原子作为最后一个参数,但第一个类型放宽以接受几个有用的表示。输出之一固定为原子,并不与字符串统一。 – CapelliC

1

在SWI-Prolog的也有

library(md5): MD5 hashes计算MD5从Prolog的 字符串哈希。这是一个相当短期的解决方案,等待更多的OpenSSL的libcrypto函数的通用接口。

(这是一个子章节md5_hash)。

这是SWI-Prolog C-library内,则必须使用use_module(library(md5)).

加载......不幸的是,这并不在我的Fedora 24的RPM包pl-7.2.3-3.fc24.x86_64似乎不完整的工作。没有文件/usr/lib64/swipl-7.2.3/library/md5.pl确实:

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

为什么!!

另一方面,我们有模块“沙”(/usr/lib64/swipl-7.2.3/library/sha.pl)。正如我刚才想的哈希值,这似乎不够好:

library(sha): SHA1 and SHA2 Secure Hash Algorithms:库库 (SHA)提供了FIPS(联邦 信息处理标准)认可的安全散列Algorihms。

好了,所以:

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

唧唧作响!

+0

好的答案!时间从手册更新报价:-) – mat