diff --git a/helper/hashcode/hashcode.go b/helper/hashcode/hashcode.go index 1cc8fa1645fb..214a2f1e5908 100644 --- a/helper/hashcode/hashcode.go +++ b/helper/hashcode/hashcode.go @@ -5,6 +5,15 @@ import ( ) // String hashes a string to a unique hashcode. +// +// crc32 returns a uint32, but for our use we need +// and non negative integer. Here we cast to an integer +// and invert it if the result is negative. func String(s string) int { - return int(crc32.ChecksumIEEE([]byte(s))) + v := int(crc32.ChecksumIEEE([]byte(s))) + if v < 0 { + return -v + } + + return v } diff --git a/helper/hashcode/hashcode_test.go b/helper/hashcode/hashcode_test.go index 5406f40bf677..47bc85760e98 100644 --- a/helper/hashcode/hashcode_test.go +++ b/helper/hashcode/hashcode_test.go @@ -10,7 +10,16 @@ func TestString(t *testing.T) { for i := 0; i < 100; i++ { actual := String(v) if actual != expected { - t.Fatalf("bad: %#v", actual) + t.Fatalf("bad: %#v\n\t%#v", actual, expected) + } + } +} + +func TestString_positiveIndex(t *testing.T) { + ips := []string{"192.168.1.3", "192.168.1.5"} + for _, ip := range ips { + if index := String(ip); index < 0 { + t.Fatalf("Bad Index %#v for ip %s", index, ip) } } }