如何用已知测试向量验证Go语言SipHash2-4实现的正确性?
验证SipHash2-4实现正确性及结果不一致排查
一、用标准测试向量验证实现
SipHash有官方定义的测试向量,可直接用来校验你的sipHashDigest函数:
- 获取测试向量:参考SipHash原始规范中的标准向量,比如密钥为
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f时:- 空输入对应的SipHash2-4输出为
726fdb47dd0e0e31 - 单字节输入
00对应的输出为74f839c593dc67fd
- 空输入对应的SipHash2-4输出为
- 编写单元测试:在Go中编写测试用例,将向量的密钥、输入、预期结果传入你的函数做对比,示例代码如下:
package yourpackage import ( "testing" "github.com/dchest/siphash" ) func TestSipHashDigest(t *testing.T) { // 测试空输入场景 key := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f} input := []byte{} expected := uint64(0x726fdb47dd0e0e31) result := sipHashDigest(key, input) // 替换为你的函数调用 if result != expected { t.Errorf("Expected 0x%x, got 0x%x", expected, result) } // 测试单字节输入场景 inputSingleByte := []byte{0x00} expectedSingleByte := uint64(0x74f839c593dc67fd) resultSingleByte := sipHashDigest(key, inputSingleByte) if resultSingleByte != expectedSingleByte { t.Errorf("Expected 0x%x, got 0x%x", expectedSingleByte, resultSingleByte) } }
- 运行测试:执行
go test -v,若所有用例通过,说明实现符合SipHash2-4的标准逻辑。
二、与在线工具结果不一致的常见原因
- 密钥处理逻辑不同:你的函数会将密钥归一化为16字节且填充随机字节,但在线工具可能采用不同的处理方式——比如对短密钥补0、直接截断,或不做归一化,这会导致实际使用的密钥完全不同,输出自然不一致。
- 输入编码差异:若你输入的是字符串,在线工具默认用UTF-8编码转换为字节,而你的函数可能错误处理了字符串编码(比如使用其他编码、截断多字节字符),导致输入字节数组不一致。
- SipHash变体不匹配:在线工具可能默认使用SipHash1-3而非SipHash2-4,或输出采用小端字节序的十六进制(你的函数可能输出大端序),导致看起来结果不同。
- 输出格式差异:你的函数返回的是原始
uint64值,而在线工具可能输出小写/大写十六进制、带0x前缀或去掉前导零的格式,需确认双方格式是否统一。
内容的提问来源于stack exchange,提问作者lordav
相关产品推荐
相关产品推荐

