Answers:
AFAIK,此类“魔术”值具有以下两个属性:
您可能会在MD5中找到类似的情况。考虑以下行:
k[i] := floor(abs(sin(i + 1)) × (2 pow 32))
在这里,sin(i + 1)
意在产生神奇的价值;这是唯一的,外观随机的,并且可以在很多情况下使用i
。(实际上,i
范围是0..63)。
编辑:阅读关于TEA的原始论文,人们知道“ Steven Stadnicki”给出的答案是正确的。请注意,魔术常数是名称delta:
每轮使用不同的增量倍数,因此倍数的任何位都不会频繁变化。我们怀疑算法对delta的值不是很敏感,我们只需要避免一个坏值即可。将会注意到,截断或最接近的舍入后,delta变成奇数,因此不需要额外的预防措施来确保总和的所有数字都发生变化。
由于仅使用了32倍的增量(每轮一个),因此算法对任何特定的增量都不十分敏感,这并不奇怪。(有关更多信息,请参见Steven Stadnicki的答案。)
编辑2:顺便说一句,MD4在其运算中使用2(0x5a827999)和3(0x6ed9eba1)的平方根作为“魔术”常量。《网络安全:公共世界中的私人通信》一书的5.4.4节很好地解释了这一点:
为了表明设计者没有故意选择常量的分解值,该常量基于2的平方根。
这种解释与下面吉尔斯在评论中提出的观点相同。
线性同余随机数生成器的,用于较小的;但是,在大多数情况下,这是民俗化的黑魔法,更多的是基于直觉,“这个数字的小倍数是mod会很不好”,而不是任何具体的理论结果。
k[i]
MD5中的定义有任何意见吗?(请参阅上面的答案。)