计算MD5正弦整数部分时出现问题

3

我在玩MD5实现,并使用维基百科上的伪代码编写以下内容,用于整数正弦的二进制部分。我发现我的输出与广泛可用的预计算表之间存在差异。

我正在尝试弄清楚我的代码是否不正确,还是维基百科上的伪代码不正确。将下面代码中的math.Floor替换为math.Ceil可以修复预计算表与我的输出之间的差异。

package main

import "fmt"
import "math"

func main() {
        var i float64
        for i < 64 {
                x := uint(math.Floor(float64(math.MaxUint32) * math.Abs(math.Sin(i+1))))
                fmt.Printf("%d : %x\n", uint(i+1), x)
                i = i + 1
        }
}

1 : d76aa477
2 : e8c7b755
3 : 242070db
4 : c1bdceee

第1行和第2行与预计算表不同,而第3行是一致的。

1个回答

4
问题出在math.MaxUint32,它比预期的多1! 也就是说,它是2的32次方减1,而不是2的32次方。

但无论如何,最简单/最快/常用/最佳的选择是使用预计算表。

确定性MD5规范是RFC 1321:

4294967296倍于abs(sin(i))的整数部分,其中i以弧度表示。

在此,“整数部分”应理解为底函数。有了适当精度的floor(abs(sin)),这会给出RFC表中的数字。这里是经过重新格式化为每个条目8个十六进制数字,并与Wolfram's Alpha输出的BaseForm[Floor[Abs[2^32 Sin[Range[64]]]],16]进行交叉核对的表格:

d76aa478 e8c7b756 242070db c1bdceee f57c0faf 4787c62a a8304613 fd469501 698098d8 8b44f7af ffff5bb1 895cd7be 6b901122 fd987193 a679438e 49b40821 f61e2562 c040b340 265e5a51 e9b6c7aa d62f105d 02441453 d8a1e681 e7d3fbc8 21e1cde6 c33707d6 f4d50d87 455a14ed a9e3e905 fcefa3f8 676f02d9 8d2a4c8a fffa3942 8771f681 6d9d6122 fde5380c a4beea44 4bdecfa9 f6bb4b60 bebfbc70 289b7ec6 eaa127fa d4ef3085 04881d05 d9d4d039 e6db99e5 1fa27cf8 c4ac5665 f4292244 432aff97 ab9423a7 fc93a039 655b59c3 8f0ccc92 ffeff47d 85845dd1 6fa87e4f fe2ce6e0 a3014314 4e0811a1 f7537e82 bd3af235 2ad7d2bb eb86d391 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接