def compare_hashes(presented, computed)
      if computed.length == presented.length then
        computed.chars.zip(presented.chars).map {|x,y| x == y}.all?
      else
        false
      end
    end
def compare_hashes(presented, computed)
      if computed.length == presented.length then
        computed.chars.zip(presented.chars).map {|x,y| x == y}.all?
      else
        false
      end
    end
compares two hashes in a manner that's invulnerable to timing sidechannel attacks (see issue #16)
 by comparing them characterwise up to the end in all cases, no matter where the mismatch happens
 short circuits if the length does not match since this does not allow timing sidechannel attacks.