比较Python中对象的位表示

比较Python中对象的位表示,python,hash,bit,Python,Hash,Bit,我正在观看一个名为的视频,其代码如下: 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 = 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
因此,总结我的问题:

  • bits
    是Python2中的内置方法吗
  • 是比较对象位表示的推荐方法,请使用以下内容:
  • 根据处理器的不同,不是所有对象都应该具有相同长度的表示对象的位吗?如果我多次运行以下代码,就会得到以下结果:
  • 不,
    不是Python 2或Python 3中的内置函数
  • 默认情况下,
    format()
    不显示前导零。使用格式字符串
    032b
    对32个字符字段中的数字进行格式设置,并使用前导零
  • 您遇到的另一个问题是
    hash()
    可能返回负数。也许这在Python2中不会发生,或者他的
    bits()
    函数显示数字的两个补码位。可以通过规范化输入来实现这一点:

    def bits(n):
        if n < 0:
            n = 2**32 + n
        return format(n, '032b')
    
    def位(n):
    如果n<0:
    n=2**32+n
    返回格式(n,‘032b’)
    
  • 每次运行代码时,都会定义新的
    fn
    nf
    函数。不同的函数不一定具有相同的哈希代码,即使它们具有相同的名称
  • 如果不重新定义函数,每次应该得到相同的哈希代码

    哈希字符串和数字只取决于内容,但哈希更复杂的对象取决于特定实例

    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
    
    >>> format(hash('Monty'), '032b')
    '1001000100011010010110101101101011000010101011100110001010001'
    
    def bits(n):
        if n < 0:
            n = 2**32 + n
        return format(n, '032b')