计算正弦的 MD5 整数部分时遇到问题

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


我试图弄清楚我的代码是否不正确或维基百科上的伪代码不正确。在下面的代码中替换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 行是一致的。


繁星coding
浏览 96回答 1
1回答

白猪掌柜的

问题是math.MaxUint32哪个是一个接一个!也就是说,2&nbsp;32&nbsp;-1 而不是 2&nbsp;32。但无论如何,最简单/最快/常见/最好的选择是使用预先计算的表。最终的 MD5 规范是RFC 1321:the integer part of 4294967296 times abs(sin(i)), where i is in radians.其中“整数部分”应理解为底函数。当然,在适当的精度下floor(abs(sin)),它给出了 RFC 表中的数字。在这里,每个条目重新格式化为 8 个十六进制数字,并与Wolfram 的 Alpha吐出的内容进行了交叉检查BaseForm[Floor[Abs[2^32 Sin[Range[64]]]],16]。d76aa478&nbsp;e8c7b756&nbsp;242070db&nbsp;c1bdceee&nbsp;f57c0faf&nbsp;4787c62a&nbsp;a8304613&nbsp;fd469501&nbsp;698098d8&nbsp;8b44f7af&nbsp;ffff5bb1&nbsp;895cd7be&nbsp;6b901122&nbsp;fd987193&nbsp;a679438e&nbsp;49b40821&nbsp;f61e2562&nbsp;c040b340&nbsp;265e5a51&nbsp;e9b6c7aa&nbsp;d62f105d&nbsp;02441453&nbsp;d8a1e681&nbsp;e7d3fbc8&nbsp;21e1cde6&nbsp;c33707d6&nbsp;f4d50d87&nbsp;455a14ed&nbsp;a9e3e905&nbsp;fcefa3f8&nbsp;676f02d9&nbsp;8d2a4c8a&nbsp;fffa3942&nbsp;8771f681&nbsp;6d9d6122&nbsp;fde5380c&nbsp;a4beea44&nbsp;4bdecfa9&nbsp;f6bb4b60&nbsp;bebfbc70&nbsp;289b7ec6&nbsp;eaa127fa&nbsp;d4ef3085&nbsp;04881d05&nbsp;d9d4d039&nbsp;e6db99e5&nbsp;1fa27cf8&nbsp;c4ac5665&nbsp;f4292244&nbsp;432aff97&nbsp;ab9423a7&nbsp;fc93a039&nbsp;655b59c3&nbsp;8f0ccc92&nbsp;ffeff47d&nbsp;85845dd1&nbsp;6fa87e4f&nbsp;fe2ce6e0&nbsp;a3014314&nbsp;4e0811a1&nbsp;f7537e82&nbsp;bd3af235&nbsp;2ad7d2bb&nbsp;eb86d391
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go