@@ -145,5 +145,186 @@ public int ToHashCode ()
145145 hash = MixFinal ( hash ) ;
146146 return ( int ) hash ;
147147 }
148+
149+ public static int Combine < T1 > ( T1 value1 )
150+ {
151+ // Provide a way of diffusing bits from something with a limited
152+ // input hash space. For example, many enums only have a few
153+ // possible hashes, only using the bottom few bits of the code. Some
154+ // collections are built on the assumption that hashes are spread
155+ // over a larger space, so diffusing the bits may help the
156+ // collection work more efficiently.
157+
158+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
159+
160+ uint hash = MixEmptyState ( ) ;
161+ hash += 4 ;
162+
163+ hash = QueueRound ( hash , hc1 ) ;
164+
165+ hash = MixFinal ( hash ) ;
166+ return ( int ) hash ;
167+ }
168+
169+ public static int Combine < T1 , T2 > ( T1 value1 , T2 value2 )
170+ {
171+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
172+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
173+
174+ uint hash = MixEmptyState ( ) ;
175+ hash += 8 ;
176+
177+ hash = QueueRound ( hash , hc1 ) ;
178+ hash = QueueRound ( hash , hc2 ) ;
179+
180+ hash = MixFinal ( hash ) ;
181+ return ( int ) hash ;
182+ }
183+
184+ public static int Combine < T1 , T2 , T3 > ( T1 value1 , T2 value2 , T3 value3 )
185+ {
186+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
187+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
188+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
189+
190+ uint hash = MixEmptyState ( ) ;
191+ hash += 12 ;
192+
193+ hash = QueueRound ( hash , hc1 ) ;
194+ hash = QueueRound ( hash , hc2 ) ;
195+ hash = QueueRound ( hash , hc3 ) ;
196+
197+ hash = MixFinal ( hash ) ;
198+ return ( int ) hash ;
199+ }
200+
201+ public static int Combine < T1 , T2 , T3 , T4 > ( T1 value1 , T2 value2 , T3 value3 , T4 value4 )
202+ {
203+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
204+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
205+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
206+ uint hc4 = ( uint ) ( value4 ? . GetHashCode ( ) ?? 0 ) ;
207+
208+ Initialize ( out uint v1 , out uint v2 , out uint v3 , out uint v4 ) ;
209+
210+ v1 = Round ( v1 , hc1 ) ;
211+ v2 = Round ( v2 , hc2 ) ;
212+ v3 = Round ( v3 , hc3 ) ;
213+ v4 = Round ( v4 , hc4 ) ;
214+
215+ uint hash = MixState ( v1 , v2 , v3 , v4 ) ;
216+ hash += 16 ;
217+
218+ hash = MixFinal ( hash ) ;
219+ return ( int ) hash ;
220+ }
221+
222+ public static int Combine < T1 , T2 , T3 , T4 , T5 > ( T1 value1 , T2 value2 , T3 value3 , T4 value4 , T5 value5 )
223+ {
224+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
225+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
226+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
227+ uint hc4 = ( uint ) ( value4 ? . GetHashCode ( ) ?? 0 ) ;
228+ uint hc5 = ( uint ) ( value5 ? . GetHashCode ( ) ?? 0 ) ;
229+
230+ Initialize ( out uint v1 , out uint v2 , out uint v3 , out uint v4 ) ;
231+
232+ v1 = Round ( v1 , hc1 ) ;
233+ v2 = Round ( v2 , hc2 ) ;
234+ v3 = Round ( v3 , hc3 ) ;
235+ v4 = Round ( v4 , hc4 ) ;
236+
237+ uint hash = MixState ( v1 , v2 , v3 , v4 ) ;
238+ hash += 20 ;
239+
240+ hash = QueueRound ( hash , hc5 ) ;
241+
242+ hash = MixFinal ( hash ) ;
243+ return ( int ) hash ;
244+ }
245+
246+ public static int Combine < T1 , T2 , T3 , T4 , T5 , T6 > ( T1 value1 , T2 value2 , T3 value3 , T4 value4 , T5 value5 , T6 value6 )
247+ {
248+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
249+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
250+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
251+ uint hc4 = ( uint ) ( value4 ? . GetHashCode ( ) ?? 0 ) ;
252+ uint hc5 = ( uint ) ( value5 ? . GetHashCode ( ) ?? 0 ) ;
253+ uint hc6 = ( uint ) ( value6 ? . GetHashCode ( ) ?? 0 ) ;
254+
255+ Initialize ( out uint v1 , out uint v2 , out uint v3 , out uint v4 ) ;
256+
257+ v1 = Round ( v1 , hc1 ) ;
258+ v2 = Round ( v2 , hc2 ) ;
259+ v3 = Round ( v3 , hc3 ) ;
260+ v4 = Round ( v4 , hc4 ) ;
261+
262+ uint hash = MixState ( v1 , v2 , v3 , v4 ) ;
263+ hash += 24 ;
264+
265+ hash = QueueRound ( hash , hc5 ) ;
266+ hash = QueueRound ( hash , hc6 ) ;
267+
268+ hash = MixFinal ( hash ) ;
269+ return ( int ) hash ;
270+ }
271+
272+ public static int Combine < T1 , T2 , T3 , T4 , T5 , T6 , T7 > ( T1 value1 , T2 value2 , T3 value3 , T4 value4 , T5 value5 , T6 value6 , T7 value7 )
273+ {
274+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
275+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
276+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
277+ uint hc4 = ( uint ) ( value4 ? . GetHashCode ( ) ?? 0 ) ;
278+ uint hc5 = ( uint ) ( value5 ? . GetHashCode ( ) ?? 0 ) ;
279+ uint hc6 = ( uint ) ( value6 ? . GetHashCode ( ) ?? 0 ) ;
280+ uint hc7 = ( uint ) ( value7 ? . GetHashCode ( ) ?? 0 ) ;
281+
282+ Initialize ( out uint v1 , out uint v2 , out uint v3 , out uint v4 ) ;
283+
284+ v1 = Round ( v1 , hc1 ) ;
285+ v2 = Round ( v2 , hc2 ) ;
286+ v3 = Round ( v3 , hc3 ) ;
287+ v4 = Round ( v4 , hc4 ) ;
288+
289+ uint hash = MixState ( v1 , v2 , v3 , v4 ) ;
290+ hash += 28 ;
291+
292+ hash = QueueRound ( hash , hc5 ) ;
293+ hash = QueueRound ( hash , hc6 ) ;
294+ hash = QueueRound ( hash , hc7 ) ;
295+
296+ hash = MixFinal ( hash ) ;
297+ return ( int ) hash ;
298+ }
299+
300+ public static int Combine < T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > ( T1 value1 , T2 value2 , T3 value3 , T4 value4 , T5 value5 , T6 value6 , T7 value7 , T8 value8 )
301+ {
302+ uint hc1 = ( uint ) ( value1 ? . GetHashCode ( ) ?? 0 ) ;
303+ uint hc2 = ( uint ) ( value2 ? . GetHashCode ( ) ?? 0 ) ;
304+ uint hc3 = ( uint ) ( value3 ? . GetHashCode ( ) ?? 0 ) ;
305+ uint hc4 = ( uint ) ( value4 ? . GetHashCode ( ) ?? 0 ) ;
306+ uint hc5 = ( uint ) ( value5 ? . GetHashCode ( ) ?? 0 ) ;
307+ uint hc6 = ( uint ) ( value6 ? . GetHashCode ( ) ?? 0 ) ;
308+ uint hc7 = ( uint ) ( value7 ? . GetHashCode ( ) ?? 0 ) ;
309+ uint hc8 = ( uint ) ( value8 ? . GetHashCode ( ) ?? 0 ) ;
310+
311+ Initialize ( out uint v1 , out uint v2 , out uint v3 , out uint v4 ) ;
312+
313+ v1 = Round ( v1 , hc1 ) ;
314+ v2 = Round ( v2 , hc2 ) ;
315+ v3 = Round ( v3 , hc3 ) ;
316+ v4 = Round ( v4 , hc4 ) ;
317+
318+ v1 = Round ( v1 , hc5 ) ;
319+ v2 = Round ( v2 , hc6 ) ;
320+ v3 = Round ( v3 , hc7 ) ;
321+ v4 = Round ( v4 , hc8 ) ;
322+
323+ uint hash = MixState ( v1 , v2 , v3 , v4 ) ;
324+ hash += 32 ;
325+
326+ hash = MixFinal ( hash ) ;
327+ return ( int ) hash ;
328+ }
148329 }
149330}
0 commit comments