Выполните ИЛИ на двух хеш-выходах sha1sum - PullRequest
1 голос
/ 10 ноября 2009

Я хочу выполнить sha1sum file1 и sha1sum file2 и выполнить битовую операцию ИЛИ с ними, используя bash. Вывод должен быть распечатан, т.е. 53a23bc2e24d039 ... (160 бит)

Как я могу это сделать?

Я знаю

echo $ ((0xa | 0xb)), но как расширить до 40 шестнадцатеричных цифр?

Спасибо

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

Не думаю, что вы действительно хотите 160-битное ИЛИ, но если вы это сделаете:

split32 () {
  x='s/\(........\)\(........\)\(........\)\(........\)\(........\)/'
  x=$x'0x\1 0x\2 0x\3 0x\4 0x\5/'
  sed -e "$x"
}

(sha1sum $1 | split32; sha1sum $2 | split32) | (
    read a1 b1 c1 d1 e1 x1
    read a2 b2 c2 d2 e2 x2
    a=$(($a1 | $a2))
    b=$(($b1 | $b2))
    c=$(($c1 | $c2))
    d=$(($d1 | $d2))
    e=$(($e1 | $e2))
    printf '  %08x%08x%08x%08x%08x\n' $a1 $b1 $c1 $d1 $e1
    printf '+ %08x%08x%08x%08x%08x\n' $a2 $b2 $c2 $d2 $e2
    printf '= %08x%08x%08x%08x%08x\n' $a  $b  $c  $d  $e 
)
$ bash bigOr.sh fun.tar fun.tgz
  e515d3813b17c36b9a7d29f7aea3e79e264449b7
+ 4f201513105c301944d0a0ba5864d9f07544ca76
= ef35d7933b5ff37bdefda9fffee7fffe7744cbf7
1 голос
/ 10 ноября 2009

Попробуйте это:

val1=$(sha1sum file1)
val1=${val1% *}
val2=$(sha1sum file2)
val2=${val2% *}
val3=$(( 0x$val1 | 0x$val2 ))
printf "%x\n" $val3
0 голосов
/ 10 ноября 2009

вы можете использовать gawk

sha1sum file1 file2 | awk '{sh1=$1;getline;sh2=$1;print or(sh1,sh2);exit}'
0 голосов
/ 10 ноября 2009

На моей машине bash может обрабатывать целочисленную арифметику фиксированной ширины со 64-битными значениями со знаком. Это означает, что я могу поразрядно ИЛИ семь байтов одновременно.

Один из вариантов - разделить контрольную сумму на три части и выполнить с ними ИЛИ. Вы можете получить «вывод на печать» позже printf "%x" $val.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...