xxhash32_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package core
  2. import "testing"
  3. // TestXXH32Vectors 对照 xxHash 参考实现的公开测试向量, 验证纯 Go 实现逐位一致。
  4. // 这三个向量 (空串/"a"/"abc") 是 xxHash 官方文档与多个独立实现共同引用的标准值。
  5. func TestXXH32Vectors(t *testing.T) {
  6. cases := []struct {
  7. in string
  8. want uint32
  9. }{
  10. {"", 0x02CC5D05},
  11. {"a", 0x550D7456},
  12. {"abc", 0x32D153FF},
  13. }
  14. for _, c := range cases {
  15. if got := XXH32([]byte(c.in)); got != c.want {
  16. t.Errorf("XXH32(%q) = %08x, 想要 %08x", c.in, got, c.want)
  17. }
  18. }
  19. }
  20. // TestXXH32StripePath 跨 16 字节条纹阈值的输入 (验证四累加器路径与尾部路径的组合),
  21. // 钉死"同输入必得同值"的确定性 + 单比特雪崩敏感性。
  22. func TestXXH32StripePath(t *testing.T) {
  23. long := make([]byte, 4096)
  24. for i := range long {
  25. long[i] = byte(i * 7)
  26. }
  27. if XXH32(long) != XXH32(long) {
  28. t.Fatal("XXH32 非确定性")
  29. }
  30. b := make([]byte, 4096)
  31. copy(b, long)
  32. b[2048] ^= 0x01
  33. if XXH32(long) == XXH32(b) {
  34. t.Fatal("单比特翻转未改变 CRC —— 雪崩失效")
  35. }
  36. // 4KB 固定输入的回归锚: 算法正确性由上方官方向量背书 (尾部/空输入路径),
  37. // 此处钉死条纹路径 (>=16B 四累加器) 的实现值, 任何实现漂移立即暴露。
  38. const ref = 0xC1FF0304
  39. if got := XXH32(long); got != ref {
  40. t.Errorf("XXH32(4KB pattern) = %08x, 想要 %08x —— 条纹路径实现漂移", got, ref)
  41. }
  42. }