2015-10-14 4 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]). 

в любом случае, я не могу заставить его работать. Я уверен, что у меня что-то не хватает, поскольку я совершенно новый в прологе. Любой намек?

EDIT

Для лучшего объяснения, я предполагаю создать положение, похожее на это:

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. 

Благодарности

(реализация Прологе: SWI-Пролог на Mac 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

Brilliant! Можете ли вы также объяснить, почему это работает rdf_atom_md5 («долго жить и процветать», 1, 'bf1835ce984d2a97d31409394fe00e9a'). , а это rdf_atom_md5 («долго жить и процветать», 1, «bf1835ce984d2a97d31409394fe00e9a») нет? – balanza

+1

Это асимметрия в обработке параметров. Учитывая имя, предикат ожидал бы, что атом будет первым параметром, а атом - последним параметром, но тип первого ослаблен, чтобы принять несколько полезных представлений. Выходной сигнал фиксируется на атоме и не объединяется со строкой. – CapelliC

1

В SWI-Prolog есть также

library(md5): MD5 hashes: Compute MD5-хэшей из строки Пролога. Это довольно краткосрочное решение, ожидающее более общего интерфейса к функциям libcrypto OpenSSL.

(подраздел этого является 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 

ПОЧЕМУ !!

С другой стороны, у нас есть модуль «sha» (/usr/lib64/swipl-7.2.3/library/sha.pl). Как я только хочу значение хеш-функции, это, кажется, достаточно хорошо:

library(sha): SHA1 and SHA2 Secure Hash Algorithms: Библиотека библиотека (ша) обеспечивает Secure Hash Algorihms утвержденные FIPS (Federal Information Processing Standard).

Ok, так:

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

Noice!

+0

Хороший ответ! Время обновить цитаты из руководства :-) – mat

Смежные вопросы