hashstructure icon indicating copy to clipboard operation
hashstructure copied to clipboard

SlicesAsSets option behaves poorly with duplicate items in the slice

Open tzneal opened this issue 3 years ago • 3 comments

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>

tzneal avatar Mar 04 '22 16:03 tzneal

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

jpalawaga avatar Oct 03 '22 21:10 jpalawaga

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"}

tzneal avatar Oct 03 '22 21:10 tzneal

My apologies, I apparently can't see straight.

jpalawaga avatar Oct 04 '22 02:10 jpalawaga