2016-09-10 1 views
2
$ echo * 
a b c 
$ cat * 
file 1 
file 2 
file 3 
$ factor -e=" \ 
> USING: globs io sequences sorting io.files io.encodings.utf8 ; \ 
> \"*\" glob natural-sort [ utf8 file-lines ] map concat [ print ] each " 
file 1 
file 2 
file 3 

Выходы одинаковы с использованием шарика фактора и шарла оболочки. A diff на выходах показывает, что они точно совпадают.Получите ту же сумму SHA-224 в Factor как coreutils sha224sum

$ factor -e=" \ 
> USING: math.parser checksums checksums.sha globs io sequences sorting io.files io.encodings.utf8 ; \ 
> \"*\" glob natural-sort [ utf8 file-lines ] map concat sha-224 checksum-lines bytes>hex-string print " 

0feaf7d5c46b802404760778091ed1312ba82d4206b9f93c35570a1a 
$ cat * | sha224sum 
d1240479399e5a37f8e62e2935a7ac4b9352e41d6274067b27a36101 

Но контрольные суммы не совпадают, и не будет md5 контрольных сумм. Почему это? Как получить такую ​​же контрольную сумму в Factor, как в coreutils sha224sum?

Изменение кодировки на ascii не изменяет выход, равно "\n" join sha-224 checksum-bytes вместо checksum-lines.

+0

Вам не хватает "\ n" присоединиться к anter concat? Я думаю, что код фактора хеширует массив из 3-х файлов –

+0

nevermind, строки контрольной суммы присоединяются к ascii 10, так что это не так:/ –

+0

О, это прослеживающая новая строка, которая отсутствует! На это был дан ответ в списке рассылки, было бы неплохо дать ответ и здесь. –

ответ

2

Это странное поведение связано с ошибкой в ​​строках контрольной суммы. factor/factor#1708

Благодаря jonenst для поиска проблемы, и calsioro для этого кода в списке Фактор рассылки:

Этот код:

[ 
    { "a" "b" "c" } 3 [1,b] 
    [ number>string "file " prepend [ write ] curry 
     ascii swap with-file-writer ] 2each 

    "*" glob natural-sort [ utf8 file-lines ] map concat 
    [ "\n" append ] map "" join ! Add newlines between and at the end 

    sha-224 checksum-bytes bytes>hex-string print 
] with-test-directory 

дает тот же хэш:

d1240479399e5a37f8e62e2935a7ac4b9352e41d6274067b27a36101

+0

(На самом деле это был Джон Харпер, который нашел проблему ... кредит должен пойти к нему, а не ко мне) –

+1

@fedes. Обновлено c: – cat

0

jonenst также pointed out что:

Кроме того, в отношении трех различных длин вы получаете, «exercism/самообновляться/само-update.factor» отсутствует символ «\ п» символ в конце Последняя линия. Вот почему вы получаете неожиданные результаты.

Если вы пытаетесь использовать файлы контрольной суммы, убедитесь, что все они заканчиваются завершающей новой строкой.

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