using System.Collections.Generic;
public static void Main()
var list1 = new [] {1,2,3};
var list2 = new [] {1,3,0};
var h1 = GetOrderIndependentHashCode2(list1);
var h2 = GetOrderIndependentHashCode2(list2);
public static int GetOrderIndependentHashCode<T>(IEnumerable<T> source)
foreach (T element in source)
int h = EqualityComparer<T>.Default.GetHashCode(element);
hash = unchecked (hash * h);
public static int GetOrderIndependentHashCode2<T>(IEnumerable<T> source)
var valueCounts = new Dictionary<T, int>();
foreach (T element in source)
curHash = EqualityComparer<T>.Default.GetHashCode(element);
if (valueCounts.TryGetValue(element, out bitOffset))
valueCounts[element] = bitOffset + 1;
valueCounts.Add(element, bitOffset);
hash = unchecked(hash + ((curHash << bitOffset) |
(curHash >> (32 - bitOffset))) * 37);