Hash MD5哈希算法使用哪种类型的leftrotation?

Hash MD5哈希算法使用哪种类型的leftrotation?,hash,md5,bitwise-operators,Hash,Md5,Bitwise Operators,在MD5 Wikipedia网站上完全可用的这段伪代码中,有一个伪函数leftrotate() for each 512-bit chunk of message break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15 //Initialize hash value for this chunk: var int A := a0 var int B := b0 var int C := c0 var i

在MD5 Wikipedia网站上完全可用的这段伪代码中,有一个伪函数leftrotate()

for each 512-bit chunk of message
    break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15
//Initialize hash value for this chunk:
    var int A := a0
    var int B := b0
    var int C := c0
    var int D := d0
//Main loop:
    for i from 0 to 63
        if 0 ≤ i ≤ 15 then
            F := (B and C) or ((not B) and D)
            g := i
        else if 16 ≤ i ≤ 31
            F := (D and B) or ((not D) and C)
            g := (5×i + 1) mod 16
        else if 32 ≤ i ≤ 47
            F := B xor C xor D
            g := (3×i + 5) mod 16
        else if 48 ≤ i ≤ 63
            F := C xor (B or (not D))
            g := (7×i) mod 16
        dTemp := D
        D := C
        C := B
        B := B + leftrotate((A + F + K[i] + M[g]), s[i])
        A := dTemp
    end for
//Add this chunk's hash to result so far:
    a0 := a0 + A
    b0 := b0 + B
    c0 := c0 + C
    d0 := d0 + D
end for

var char digest[16] := a0 append b0 append c0 append d0 //(Output is in little-endian)

//leftrotate function definition
leftrotate (x, c)
    return (x << c) binary or (x >> (32-c));
用于消息的每个512位块
将块分解为十六个32位字M[j],0≤ J≤ 15
//初始化此区块的哈希值:
变量int A:=a0
变量int B:=b0
变量int C:=c0
变量int D:=d0
//主回路:
对于i,从0到63
如果0≤ 我≤ 15那么
F:=(B和C)或((不是B和D)
g:=i
如果16≤ 我≤ 31
F:=(D和B)或((非D)和C)
g:=(5×i+1)模16
否则,如果32≤ 我≤ 47
F:=B xor C xor D
g:=(3×i+5)模16
否则,如果48≤ 我≤ 63
F:=cxor(B或(非D))
g:=(7×i)模16
dTemp:=D
D:=C
C:=B
B:=B+leftrotate((A+F+K[i]+M[g]),s[i])
A:=dTemp
结束
//将此区块的哈希添加到目前为止的结果:
a0:=a0+A
b0:=b0+B
c0:=c0+C
d0:=d0+D
结束
var char digest[16]:=a0 append b0 append c0 append d0//(输出为小尾端)
//左旋转函数定义
左旋转(x,c)
返回(x>(32-c));
但是,leftrotate()函数是逻辑旋转还是循环旋转?当我在上查看函数时,我看到了不同的左旋转。MD5哈希函数使用哪一个

第一个维基百科将轮换定义为:

leftrotate (x, c)
    return (x << c) binary or (x >> (32-c));
leftrotate(x,c)
返回(x>(32-c));
关于函数的表述不同,如下所示:

a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)

a=b+((a+F(b,c,d)+X[k]+T[i])在谷歌搜索其他一些问题时找到了答案

位旋转也称为循环移位旋转,可在此处找到额外信息: - -

循环移位将数字向左移动x个数量,将多余的数字追加到末尾


出于我自己的好奇,还有什么其他类型的旋转?你的问题、答案和维基百科都记录了我所听过的唯一一种32位整数旋转。还有什么?只有一种类型的左旋转,即旋转旋转(wut?),没有“逻辑旋转”这样的东西。有不同的,当然它们都是旋转的(duhhh),但是有不同的类型(逻辑移位、循环移位、直接进位),我想知道是哪一种。通过进位旋转只存在于汇编中,逻辑移位甚至不是旋转