hashstructure
hashstructure copied to clipboard
SlicesAsSets option behaves poorly with duplicate items in the slice
If two slices differ only by an item that is repeated in both, it's trivial to construct hash collisions.
package main
import (
"fmt"
hashstructure "github.com/mitchellh/hashstructure/v2"
)
func main() {
// clearly two different lists
list1 := []string{"a", "b", "c", "e", "e"}
list2 := []string{"a", "b", "c", "d", "d"}
// with the same hash
fmt.Println(hashstructure.Hash(list1, hashstructure.FormatV2, &hashstructure.HashOptions{SlicesAsSets: true}))
fmt.Println(hashstructure.Hash(list2, hashstructure.FormatV2, &hashstructure.HashOptions{SlicesAsSets: true}))
}
// output
// 12638153115695167423 <nil>
// 12638153115695167423 <nil>
The code sample looks correct to me—if the slice list members are the same and the set option is turned on, then the two arrays should produce the same hash.
If this happens with the set option off, then there is clearly a bug. Or perhaps, I do not understand the set option
They're not the same though, look at the last two members of each slice.
list1 := []string{"a", "b", "c", "e", "e"}
list2 := []string{"a", "b", "c", "d", "d"}
My apologies, I apparently can't see straight.