这个函数如何比较hexnumbers?

时间:2015-10-03 09:14:21

标签: hash md5

var int a0 := 0x67452301   //A
var int b0 := 0xefcdab89   //B
var int c0 := 0x98badcfe   //C
var int d0 := 0x10325476   //D    

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

这取自维基百科,特别是here,以查看完整代码。

我无法理解(B and C)生成的内容,因为BC是十六进制。 (大端)

1 个答案:

答案 0 :(得分:2)

dict是按位(32位)布尔AND运算。因此,例如int 15(0xf)和17(0x11)导致1(0x1)。

输出/输入上的数字(十六进制或十进制)的表示与它们上的操作无关。实际结果是4个32位整数,它们连在一起 - 通常打印成一个大的十六进制字符串。