The Hash impl for [T] in the standard library first hashes the length of the slice, then each element in turn. How important is the use of the length here? If I'm implementing Hash for a type that can hold e.g. a Box<[T]>, could not hashing the length conceivably cause problems?
Adding the length helps Foo([1], [2, 3]) and Foo([1, 2], [3]) have different hashes, although that's not strictly necessary.
This caused an issue for VecDeque, which didn't want its two slices to depend on length:
https://github.com/rust-lang/rust/issues/80303
Oh, I didn't think about the interaction with tuples, interesting.
In context, I have a type like this:
enum Key {
Seq(Box<[Key]>),
OtherVariant,
}
and I want to impl Hash for the Seq variant in a way that allows reproducing the same hash in an incremental context, where the items aren't collected in a slice and their number is not known up front. So maybe I'll just hash the length after all the entries instead of before.