首页 > 解决方案 > 比较 Python 中对象的位表示

问题描述

我正在观看一个名为The Mighty Dictionary的视频,其中包含以下代码:

k1 = bits(hash('Monty'))
k2 = bits(hash('Money'))
diff = ('^' [a==b] for a,b in zip(k1,k2))
print(k1,k2,''.join(diff))

据我了解,bits不是Python中的内置方法,而是他自己编写的类似于'format(x,'b')的方法,还是Python 2中存在的东西?(我从未在 Python 2 中编写过代码)

我已经尝试完成相同的操作,获取字符串的位表示并检查位的不同之处:

k1 = format(hash('Monty'),'b')
k2 = format(hash('Money'),'b')
diff = ('^ ' [a==b] for a,b in zip(k1,k2))
print(k1,'\n',k2,'\n',''.join(diff))

我确实得到了预期的结果:

已更新 必须将第一行移动 1 个空格以匹配符号

 110111010100001110100101100000100110111111110001001101111000110 
 -1000001111101001011101001010101101000111001011011000011110100 
 ^  ^^^  ^ ^^ ^^^   ^^^^^^^ ^ ^^^^^  ^^   ^^  ^^^^^^^ ^   ^ ^^^

此外,位的长度不一样,而我知道无论字符串如何,在我的情况下都将采用相同的 64 位?但它的63和62。

print(len(format(hash('Monty'),'b')))
print(len(format(hash('Money'),'b')))

63
62

所以,总结一下我的问题:

  1. bitsPython2中有内置方法吗?
  2. 比较对象的位表示的推荐方法是使用以下方法:
def fn():
    pass

print(format(hash(fn),'b'))
# -111111111111111111111111111111111101111000110001011100000000101
  1. 取决于处理器,所有对象不应该具有表示对象的相同长度的位吗?如果我多次运行以下代码,我会得到以下结果:
def fn():
    pass

def nf():
    pass

print(format(hash(fn),'b'))
print(format(hash(nf),'b'))

# first time
# 10001001010011010111110000100
# -111111111111111111111111111111111101110110101100101000001000001

# second time
# 10001001010011010111111101010
# 10001001010011010111110000100

# third time
# 10001001010011010111101010001
# -111111111111111111111111111111111101110110101100101000001000001

标签: pythonhashbit

解决方案


  1. 不,bits不是 Python 2 或 Python 3 中的内置函数。
  2. 默认情况下format()不显示前导零。使用格式字符串032b来格式化 32 个字符的字段中的数字,并带有前导零。
>>> format(hash('Monty'), '032b')
'1001000100011010010110101101101011000010101011100110001010001'

您遇到的另一个问题是hash()可以返回负数。也许这在 Python 2 中不可能发生,或者他的bits()函数显示了数字的二进制补码位。您可以通过规范化输入来做到这一点:

def bits(n):
    if n < 0:
        n = 2**32 + n
    return format(n, '032b')
  1. 每次运行代码时,您都会定义新函数fnnf函数。不同的函数不一定具有相同的哈希码,即使它们具有相同的名称。

如果不重新定义函数,则每次都应该得到相同的哈希码。

散列字符串和数字仅取决于内容,但散列更复杂的对象取决于特定实例。


推荐阅读