二进制中两个字符串的汉明距离不准确

时间:2014-09-30 13:40:56

标签: python encryption cryptography

我正在尝试用二进制计算两个字符串之间的汉明距离。但是我没有得到37的预期输出。相反,我得到33.有人可以向我解释我正在犯的错误吗?

这是我的代码:

def to_bin(s):
return ''.join(format(ord(x), 'b') for x in s)
s1 = to_bin('this is a test')
s2 = to_bin('wokka wokka!!!')

def hamming_distance_bin(x,y):
    z = []
    for i,j in zip(x,y):
        z.append(ord(i)^ord(j))
    return z.count(1)



print hamming_distance_bin(s1,s2)

我使用上面的列表的原因是,我可以打印我的xor'd输出来手动计算1并看看我出错的地方。但我似乎不明白!

2 个答案:

答案 0 :(得分:2)

def to_bin(s):
    return ''.join(format(ord(x), 'b') for x in s)

返回一个可变长度的二进制字符串。你想输出一个恒定长度的:

def to_bin(s):
    return ''.join(format(ord(x), '08b') for x in s)

FWIW,我做了:

s1 = bytearray(b'this is a test')
s2 = bytearray(b'wokka wokka!!!')

def hamming_distance_bin(x,y):
    return sum(bin(i^j).count("1") for i,j in zip(x,y))

hamming_distance_bin(s1,s2)

因为bytearray比始终致电ord更整洁。

答案 1 :(得分:0)

您还可以为每个字符使用bin().zfill(8),从而解决您遇到的问题。

上面的答案是好的代码;另一种方法就是:

def hamming(str1, str2):

    score = 0

    for (a, b) in izip(str1, str2):
        a_bits = bin(ord(a))[2:].zfill(8)
        b_bits = bin(ord(b))[2:].zfill(8)

        score += sum(bx != by for bx, by in izip(a_bits, b_bits))
    return score

我认为,这样做的好处是字符串到二进制转换内置于函数本身。