Python运算符|=含义

Python运算符|=含义,python,Python,由于python的一些版本控制问题,我不得不使用一个自定义函数来比较HMAC(SHA512)。为此,我找到了以下功能: def compare_digest(x, y): if not (isinstance(x, bytes) and isinstance(y, bytes)): logfile.debug("both inputs should be instances of bytes") if len(x) != len(y): retur

由于python的一些版本控制问题,我不得不使用一个自定义函数来比较HMAC(SHA512)。为此,我找到了以下功能:

def compare_digest(x, y):
    if not (isinstance(x, bytes) and isinstance(y, bytes)):
        logfile.debug("both inputs should be instances of bytes")
    if len(x) != len(y):
        return False
    result = 0
    for a, b in zip(x, y):
        result |= a ^ b
    return result == 0
我在Django中使用它,因此我创建了一个记录器(日志文件),它将调试消息保存到一个文件中

代码在此步骤中断:

result |= a ^ b
但是,我不知道|=运算符代表什么,也不知道这里发生了什么。如果有人能解释的话,我可以试着重写一下


我的python版本是(不幸的是2.7.4)和2.7.7,我不会有问题,因为函数已经正确移植并可用。

按位或和赋值一步完成。有点像

a+=1 # which means a = a + 1

|
是按位OR运算符
|=
+=
-=
等的按位或等效形式。基本上,
a |=b
a=a | b
的缩写

result |=a^b
归结为
result=result |(a^b)
。如果
a
b
中正好有一个是
1
,那么
result
的值将不为零。顺便问一下,为什么不直接比较
x==y
中的对象呢?如果必须扫描对象,为什么不使用更容易理解的逻辑,如
If a!=b:return False
?据我所知,问题在于攻击者获得优势的定时攻击。但我没有阅读全部细节。如果计时攻击是一个问题(可能是),我认为必须消除conditiona操作符的其余部分。类似于
reduce(lambda acc,(m,n):acc和(m==n),zip(a,b),True)的东西将始终在O(len(a))时间内执行,并返回
True
iff
a==b
元素。您可以考虑将代码< >代码> x>代码>和<代码> y>代码>相同的长度,以避免发现长度的定时攻击,但是Sa512摘要无论如何都是相同的长度。好的,这似乎有点明显[感觉愚蠢]。但我仍然不明白为什么会破裂;在可能的范围内,将SO帖子限制在一个有答案的问题上被认为是一种良好的做法。当您这样做时,给出错误消息/堆栈跟踪;)