tags:

views:

119

answers:

4

Hi

I want perform sha1sum file1 and sha1sum file2 and perform bitwise OR operation with them using bash. Output should be printable i.e 53a23bc2e24d039 ... (160 bit)

How can I do this?

I know

echo $(( 0xa | 0xb )) but how to extend to 40 hexadecimal digits?

Thanks

A: 

On my machine bash can handle fixed width integer arithmetic with signed 64 bit values. This means, I can bitwise OR seven bytes at once.

One option would be splitting up your checksum in three pieces an do your OR with these. You can achieve "printable output" by printf "%x" $val later on.

mkluwe
+1  A: 

Try this:

val1=$(sha1sum file1)
val1=${val1% *}
val2=$(sha1sum file2)
val2=${val2% *}
val3=$(( 0x$val1 | 0x$val2 ))
printf "%x\n" $val3
Dennis Williamson
A: 

you can use gawk

sha1sum file1 file2 | awk '{sh1=$1;getline;sh2=$1;print or(sh1,sh2);exit}'
ghostdog74
will the output of sha1sum in this case be treated as hexadecimal digit or alphanumeric character?
idazuwaika
Each of the arguments to `or` need to be converted from hex to decimal like this: `or(strtonum("0x"sh1),strtonum("0x"sh2))` since the output of `sha1sum` is hexadecimal without a prefix. However, these numbers exceed the capacity of `gawk` (which uses float to represent *all* numbers).
Dennis Williamson
A: 

I don't think you really want a 160-bit inclusive OR, but if you do:

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
DigitalRoss