我正在使用 MD5 實現,并使用 wikipedia 上的偽代碼為整數正弦的二進制部分編寫以下代碼。我發現我的輸出與廣泛可用的預計算表之間存在差異。我試圖弄清楚我的代碼是否不正確或維基百科上的偽代碼不正確。在下面的代碼中替換math.Floor為math.Ceil修復了預計算表和我的輸出之間的差異。package mainimport "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 : d76aa4772 : e8c7b7553 : 242070db4 : c1bdceee第 1 行和第 2 行與預先計算的表不同,而第 3 行是一致的。
1 回答

白豬掌柜的
TA貢獻1893條經驗 獲得超10個贊
問題是math.MaxUint32
哪個是一個接一個!也就是說,2 32 -1 而不是 2 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 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
- 1 回答
- 0 關注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消