@@ -20,6 +20,11 @@ using namespace NKikimr;
20
20
using namespace NMiniKQL ;
21
21
using namespace NUdf ;
22
22
23
+ inline ui64 SpreadHash (ui64 hash) {
24
+ // https://probablydance.com/2018/06/16/fibonacci-hashing-the-optimization-that-the-world-forgot-or-a-better-alternative-to-integer-modulo/
25
+ return ((unsigned __int128)hash * 11400714819323198485llu) >> 64 ;
26
+ }
27
+
23
28
24
29
class TDqOutputMultiConsumer : public IDqOutputConsumer {
25
30
public:
@@ -189,6 +194,9 @@ class TDqOutputHashPartitionConsumer : public IDqOutputConsumer {
189
194
hash = CombineHashes (hash, HashColumn (keyId, columnValue));
190
195
}
191
196
197
+
198
+ hash = SpreadHash (hash);
199
+
192
200
return hash % Outputs.size ();
193
201
}
194
202
@@ -200,6 +208,8 @@ class TDqOutputHashPartitionConsumer : public IDqOutputConsumer {
200
208
hash = CombineHashes (hash, HashColumn (keyId, values[KeyColumns[keyId].Index ]));
201
209
}
202
210
211
+ hash = SpreadHash (hash);
212
+
203
213
return hash % Outputs.size ();
204
214
}
205
215
@@ -303,6 +313,8 @@ class TDqOutputHashPartitionConsumerScalar : public IDqOutputConsumer {
303
313
hash = CombineHashes (hash, HashColumn (keyId, values[KeyColumns_[keyId].Index ]));
304
314
}
305
315
316
+ hash = SpreadHash (hash);
317
+
306
318
return hash % Outputs_.size ();
307
319
}
308
320
@@ -500,6 +512,9 @@ class TDqOutputHashPartitionConsumerBlock : public IDqOutputConsumer {
500
512
}
501
513
hash = CombineHashes (hash, keyHash);
502
514
}
515
+
516
+ hash = SpreadHash (hash);
517
+
503
518
return hash % Outputs_.size ();
504
519
}
505
520
0 commit comments