Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ad21816

Browse files
committedMay 13, 2025·
Make all non-test randomness user-provided
1 parent ea8f66b commit ad21816

22 files changed

+269
-262
lines changed
 

‎include/minisketch.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,19 @@ MINISKETCH_API uint32_t minisketch_implementation_max(void);
6060
*/
6161
MINISKETCH_API int minisketch_implementation_supported(uint32_t bits, uint32_t implementation);
6262

63-
/** Construct a sketch for a given element size, implementation and capacity.
63+
/** Construct a sketch for a given element size, implementation, capacity, and RNG seed.
6464
*
6565
* If the combination of `bits` and `implementation` is unavailable, or when
6666
* OOM occurs, NULL is returned. If minisketch_implementation_supported
6767
* returns 1 for the specified bits and implementation, this will always succeed
6868
* (except when allocation fails).
6969
*
70+
* To protect against bad performance on maliciously-created sketches, it is
71+
* to use strong randomness for the provided seed value.
72+
*
7073
* If the result is not NULL, it must be destroyed using minisketch_destroy.
7174
*/
72-
MINISKETCH_API minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity);
75+
MINISKETCH_API minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity, uint64_t seed);
7376

7477
/** Get the element size of a sketch in bits. */
7578
MINISKETCH_API uint32_t minisketch_bits(const minisketch* sketch);
@@ -82,14 +85,11 @@ MINISKETCH_API uint32_t minisketch_implementation(const minisketch* sketch);
8285

8386
/** Set the seed for randomizing algorithm choices to a fixed value.
8487
*
85-
* By default, sketches are initialized with a random seed. This is important
86-
* to avoid scenarios where an attacker could force worst-case behavior.
87-
*
88-
* This function initializes the seed to a user-provided value (any 64-bit
89-
* integer is acceptable, regardless of field size).
88+
* This is equivalent to recreating the sketch with a different RNG seed.
9089
*
9190
* When seed is -1, a fixed internal value with predictable behavior is
92-
* used. It is only intended for testing.
91+
* used. It is only intended for testing. Note that minisketch_create does
92+
* assign special meaning to seed = -1.
9393
*/
9494
MINISKETCH_API void minisketch_set_seed(minisketch* sketch, uint64_t seed);
9595

@@ -263,16 +263,16 @@ class Minisketch
263263
* ImplementationSupported(), or OOM occurs internally, an invalid Minisketch
264264
* object will be constructed. Use operator bool() to check that this isn't the
265265
* case before performing any other operations. */
266-
Minisketch(uint32_t bits, uint32_t implementation, size_t capacity) noexcept
266+
Minisketch(uint32_t bits, uint32_t implementation, size_t capacity, uint64_t seed) noexcept
267267
{
268-
m_minisketch = std::unique_ptr<minisketch, Deleter>(minisketch_create(bits, implementation, capacity));
268+
m_minisketch = std::unique_ptr<minisketch, Deleter>(minisketch_create(bits, implementation, capacity, seed));
269269
}
270270

271271
/** Create a Minisketch object sufficiently large for the specified number of elements at given fpbits.
272272
* It may construct an invalid object, which you may need to check for. */
273-
static Minisketch CreateFP(uint32_t bits, uint32_t implementation, size_t max_elements, uint32_t fpbits) noexcept
273+
static Minisketch CreateFP(uint32_t bits, uint32_t implementation, size_t max_elements, uint32_t fpbits, uint64_t seed) noexcept
274274
{
275-
return Minisketch(bits, implementation, ComputeCapacity(bits, max_elements, fpbits));
275+
return Minisketch(bits, implementation, ComputeCapacity(bits, max_elements, fpbits), seed);
276276
}
277277

278278
/** Return the field size for a (valid) Minisketch object. */

‎src/bench.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ int main(int argc, char** argv) {
1818
printf("Usage: %s [syndromes=150] [errors=syndromes] [iters=10]\n", argv[0]);
1919
return 1;
2020
}
21+
std::random_device rng;
22+
std::uniform_int_distribution<uint64_t> dist;
2123
int syndromes = argc > 1 ? strtoul(argv[1], NULL, 10) : 150;
2224
int errors = argc > 2 ? strtoul(argv[2], NULL, 10) : syndromes;
2325
int iters = argc > 3 ? strtoul(argv[3], NULL, 10) : 10;
@@ -47,7 +49,7 @@ int main(int argc, char** argv) {
4749
std::vector<double> benches;
4850
benches.reserve(iters);
4951
for (int i = 0; i < iters; ++i) {
50-
states[i] = minisketch_create(bits, impl, syndromes);
52+
states[i] = minisketch_create(bits, impl, syndromes, dist(rng));
5153
if (!states[i]) break;
5254
std::set<uint64_t> done;
5355
for (int j = 0; j < errors; ++j) {
@@ -80,15 +82,13 @@ int main(int argc, char** argv) {
8082
printf("create[ns]\t% 3i\t", bits);
8183
for (uint32_t impl = 0; impl <= max_impl; ++impl) {
8284
std::vector<minisketch*> states;
83-
std::random_device rng;
84-
std::uniform_int_distribution<uint64_t> dist;
8585
std::vector<uint64_t> data;
8686
data.resize(errors * 10);
8787
states.resize(iters);
8888
std::vector<double> benches;
8989
benches.reserve(iters);
9090
for (int i = 0; i < iters; ++i) {
91-
states[i] = minisketch_create(bits, impl, syndromes);
91+
states[i] = minisketch_create(bits, impl, syndromes, dist(rng));
9292
}
9393
for (size_t i = 0; i < data.size(); ++i) {
9494
data[i] = dist(rng);

‎src/fields/clmul_1byte.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,37 +82,37 @@ typedef Field<uint8_t, 8, 27, StatTable8, &SQR_TABLE_8, &SQR2_TABLE_8, &QRT_TABL
8282
#endif
8383
}
8484

85-
Sketch* ConstructClMul1Byte(int bits, int implementation) {
85+
Sketch* ConstructClMul1Byte(int bits, int implementation, uint64_t seed) {
8686
switch (bits) {
8787
#ifdef ENABLE_FIELD_INT_5
88-
case 5: return new SketchImpl<Field5>(implementation, 5);
88+
case 5: return new SketchImpl<Field5>(implementation, 5, seed);
8989
#endif
9090
#ifdef ENABLE_FIELD_INT_8
91-
case 8: return new SketchImpl<Field8>(implementation, 8);
91+
case 8: return new SketchImpl<Field8>(implementation, 8, seed);
9292
#endif
9393
}
9494
return nullptr;
9595
}
9696

97-
Sketch* ConstructClMulTri1Byte(int bits, int implementation) {
97+
Sketch* ConstructClMulTri1Byte(int bits, int implementation, uint64_t seed) {
9898
switch (bits) {
9999
#ifdef ENABLE_FIELD_INT_2
100-
case 2: return new SketchImpl<FieldTri2>(implementation, 2);
100+
case 2: return new SketchImpl<FieldTri2>(implementation, 2, seed);
101101
#endif
102102
#ifdef ENABLE_FIELD_INT_3
103-
case 3: return new SketchImpl<FieldTri3>(implementation, 3);
103+
case 3: return new SketchImpl<FieldTri3>(implementation, 3, seed);
104104
#endif
105105
#ifdef ENABLE_FIELD_INT_4
106-
case 4: return new SketchImpl<FieldTri4>(implementation, 4);
106+
case 4: return new SketchImpl<FieldTri4>(implementation, 4, seed);
107107
#endif
108108
#ifdef ENABLE_FIELD_INT_5
109-
case 5: return new SketchImpl<FieldTri5>(implementation, 5);
109+
case 5: return new SketchImpl<FieldTri5>(implementation, 5, seed);
110110
#endif
111111
#ifdef ENABLE_FIELD_INT_6
112-
case 6: return new SketchImpl<FieldTri6>(implementation, 6);
112+
case 6: return new SketchImpl<FieldTri6>(implementation, 6, seed);
113113
#endif
114114
#ifdef ENABLE_FIELD_INT_7
115-
case 7: return new SketchImpl<FieldTri7>(implementation, 7);
115+
case 7: return new SketchImpl<FieldTri7>(implementation, 7, seed);
116116
#endif
117117
}
118118
return nullptr;

‎src/fields/clmul_2bytes.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,49 +105,49 @@ typedef Field<uint16_t, 16, 43, StatTable16, &SQR_TABLE_16, &SQR2_TABLE_16, &SQR
105105
#endif
106106
}
107107

108-
Sketch* ConstructClMul2Bytes(int bits, int implementation) {
108+
Sketch* ConstructClMul2Bytes(int bits, int implementation, uint64_t seed) {
109109
switch (bits) {
110110
#ifdef ENABLE_FIELD_INT_10
111-
case 10: return new SketchImpl<Field10>(implementation, 10);
111+
case 10: return new SketchImpl<Field10>(implementation, 10, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_11
114-
case 11: return new SketchImpl<Field11>(implementation, 11);
114+
case 11: return new SketchImpl<Field11>(implementation, 11, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_12
117-
case 12: return new SketchImpl<Field12>(implementation, 12);
117+
case 12: return new SketchImpl<Field12>(implementation, 12, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_13
120-
case 13: return new SketchImpl<Field13>(implementation, 13);
120+
case 13: return new SketchImpl<Field13>(implementation, 13, seed);
121121
#endif
122122
#ifdef ENABLE_FIELD_INT_14
123-
case 14: return new SketchImpl<Field14>(implementation, 14);
123+
case 14: return new SketchImpl<Field14>(implementation, 14, seed);
124124
#endif
125125
#ifdef ENABLE_FIELD_INT_16
126-
case 16: return new SketchImpl<Field16>(implementation, 16);
126+
case 16: return new SketchImpl<Field16>(implementation, 16, seed);
127127
#endif
128128
}
129129
return nullptr;
130130
}
131131

132-
Sketch* ConstructClMulTri2Bytes(int bits, int implementation) {
132+
Sketch* ConstructClMulTri2Bytes(int bits, int implementation, uint64_t seed) {
133133
switch (bits) {
134134
#ifdef ENABLE_FIELD_INT_9
135-
case 9: return new SketchImpl<FieldTri9>(implementation, 9);
135+
case 9: return new SketchImpl<FieldTri9>(implementation, 9, seed);
136136
#endif
137137
#ifdef ENABLE_FIELD_INT_10
138-
case 10: return new SketchImpl<FieldTri10>(implementation, 10);
138+
case 10: return new SketchImpl<FieldTri10>(implementation, 10, seed);
139139
#endif
140140
#ifdef ENABLE_FIELD_INT_11
141-
case 11: return new SketchImpl<FieldTri11>(implementation, 11);
141+
case 11: return new SketchImpl<FieldTri11>(implementation, 11, seed);
142142
#endif
143143
#ifdef ENABLE_FIELD_INT_12
144-
case 12: return new SketchImpl<FieldTri12>(implementation, 12);
144+
case 12: return new SketchImpl<FieldTri12>(implementation, 12, seed);
145145
#endif
146146
#ifdef ENABLE_FIELD_INT_14
147-
case 14: return new SketchImpl<FieldTri14>(implementation, 14);
147+
case 14: return new SketchImpl<FieldTri14>(implementation, 14, seed);
148148
#endif
149149
#ifdef ENABLE_FIELD_INT_15
150-
case 15: return new SketchImpl<FieldTri15>(implementation, 15);
150+
case 15: return new SketchImpl<FieldTri15>(implementation, 15, seed);
151151
#endif
152152
}
153153
return nullptr;

‎src/fields/clmul_3bytes.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,52 +114,52 @@ typedef Field<uint32_t, 24, 27, StatTable24, &SQR_TABLE_24, &SQR2_TABLE_24, &SQR
114114
#endif
115115
}
116116

117-
Sketch* ConstructClMul3Bytes(int bits, int implementation) {
117+
Sketch* ConstructClMul3Bytes(int bits, int implementation, uint64_t seed) {
118118
switch (bits) {
119119
#ifdef ENABLE_FIELD_INT_17
120-
case 17: return new SketchImpl<Field17>(implementation, 17);
120+
case 17: return new SketchImpl<Field17>(implementation, 17, seed);
121121
#endif
122122
#ifdef ENABLE_FIELD_INT_18
123-
case 18: return new SketchImpl<Field18>(implementation, 18);
123+
case 18: return new SketchImpl<Field18>(implementation, 18, seed);
124124
#endif
125125
#ifdef ENABLE_FIELD_INT_19
126-
case 19: return new SketchImpl<Field19>(implementation, 19);
126+
case 19: return new SketchImpl<Field19>(implementation, 19, seed);
127127
#endif
128128
#ifdef ENABLE_FIELD_INT_20
129-
case 20: return new SketchImpl<Field20>(implementation, 20);
129+
case 20: return new SketchImpl<Field20>(implementation, 20, seed);
130130
#endif
131131
#ifdef ENABLE_FIELD_INT_21
132-
case 21: return new SketchImpl<Field21>(implementation, 21);
132+
case 21: return new SketchImpl<Field21>(implementation, 21, seed);
133133
#endif
134134
#ifdef ENABLE_FIELD_INT_23
135-
case 23: return new SketchImpl<Field23>(implementation, 23);
135+
case 23: return new SketchImpl<Field23>(implementation, 23, seed);
136136
#endif
137137
#ifdef ENABLE_FIELD_INT_24
138-
case 24: return new SketchImpl<Field24>(implementation, 24);
138+
case 24: return new SketchImpl<Field24>(implementation, 24, seed);
139139
#endif
140140
}
141141
return nullptr;
142142
}
143143

144-
Sketch* ConstructClMulTri3Bytes(int bits, int implementation) {
144+
Sketch* ConstructClMulTri3Bytes(int bits, int implementation, uint64_t seed) {
145145
switch (bits) {
146146
#ifdef ENABLE_FIELD_INT_17
147-
case 17: return new SketchImpl<FieldTri17>(implementation, 17);
147+
case 17: return new SketchImpl<FieldTri17>(implementation, 17, seed);
148148
#endif
149149
#ifdef ENABLE_FIELD_INT_18
150-
case 18: return new SketchImpl<FieldTri18>(implementation, 18);
150+
case 18: return new SketchImpl<FieldTri18>(implementation, 18, seed);
151151
#endif
152152
#ifdef ENABLE_FIELD_INT_20
153-
case 20: return new SketchImpl<FieldTri20>(implementation, 20);
153+
case 20: return new SketchImpl<FieldTri20>(implementation, 20, seed);
154154
#endif
155155
#ifdef ENABLE_FIELD_INT_21
156-
case 21: return new SketchImpl<FieldTri21>(implementation, 21);
156+
case 21: return new SketchImpl<FieldTri21>(implementation, 21, seed);
157157
#endif
158158
#ifdef ENABLE_FIELD_INT_22
159-
case 22: return new SketchImpl<FieldTri22>(implementation, 22);
159+
case 22: return new SketchImpl<FieldTri22>(implementation, 22, seed);
160160
#endif
161161
#ifdef ENABLE_FIELD_INT_23
162-
case 23: return new SketchImpl<FieldTri23>(implementation, 23);
162+
case 23: return new SketchImpl<FieldTri23>(implementation, 23, seed);
163163
#endif
164164
}
165165
return nullptr;

‎src/fields/clmul_4bytes.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,46 +112,46 @@ typedef Field<uint32_t, 32, 141, StatTable32, &SQR_TABLE_32, &SQR2_TABLE_32, &SQ
112112
#endif
113113
}
114114

115-
Sketch* ConstructClMul4Bytes(int bits, int implementation) {
115+
Sketch* ConstructClMul4Bytes(int bits, int implementation, uint64_t seed) {
116116
switch (bits) {
117117
#ifdef ENABLE_FIELD_INT_25
118-
case 25: return new SketchImpl<Field25>(implementation, 25);
118+
case 25: return new SketchImpl<Field25>(implementation, 25, seed);
119119
#endif
120120
#ifdef ENABLE_FIELD_INT_26
121-
case 26: return new SketchImpl<Field26>(implementation, 26);
121+
case 26: return new SketchImpl<Field26>(implementation, 26, seed);
122122
#endif
123123
#ifdef ENABLE_FIELD_INT_27
124-
case 27: return new SketchImpl<Field27>(implementation, 27);
124+
case 27: return new SketchImpl<Field27>(implementation, 27, seed);
125125
#endif
126126
#ifdef ENABLE_FIELD_INT_29
127-
case 29: return new SketchImpl<Field29>(implementation, 29);
127+
case 29: return new SketchImpl<Field29>(implementation, 29, seed);
128128
#endif
129129
#ifdef ENABLE_FIELD_INT_31
130-
case 31: return new SketchImpl<Field31>(implementation, 31);
130+
case 31: return new SketchImpl<Field31>(implementation, 31, seed);
131131
#endif
132132
#ifdef ENABLE_FIELD_INT_32
133-
case 32: return new SketchImpl<Field32>(implementation, 32);
133+
case 32: return new SketchImpl<Field32>(implementation, 32, seed);
134134
#endif
135135
}
136136
return nullptr;
137137
}
138138

139-
Sketch* ConstructClMulTri4Bytes(int bits, int implementation) {
139+
Sketch* ConstructClMulTri4Bytes(int bits, int implementation, uint64_t seed) {
140140
switch (bits) {
141141
#ifdef ENABLE_FIELD_INT_25
142-
case 25: return new SketchImpl<FieldTri25>(implementation, 25);
142+
case 25: return new SketchImpl<FieldTri25>(implementation, 25, seed);
143143
#endif
144144
#ifdef ENABLE_FIELD_INT_28
145-
case 28: return new SketchImpl<FieldTri28>(implementation, 28);
145+
case 28: return new SketchImpl<FieldTri28>(implementation, 28, seed);
146146
#endif
147147
#ifdef ENABLE_FIELD_INT_29
148-
case 29: return new SketchImpl<FieldTri29>(implementation, 29);
148+
case 29: return new SketchImpl<FieldTri29>(implementation, 29, seed);
149149
#endif
150150
#ifdef ENABLE_FIELD_INT_30
151-
case 30: return new SketchImpl<FieldTri30>(implementation, 30);
151+
case 30: return new SketchImpl<FieldTri30>(implementation, 30, seed);
152152
#endif
153153
#ifdef ENABLE_FIELD_INT_31
154-
case 31: return new SketchImpl<FieldTri31>(implementation, 31);
154+
case 31: return new SketchImpl<FieldTri31>(implementation, 31, seed);
155155
#endif
156156
}
157157
return nullptr;

‎src/fields/clmul_5bytes.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,52 +122,52 @@ typedef Field<uint64_t, 40, 57, StatTable40, &SQR_TABLE_40, &SQR2_TABLE_40, &SQR
122122
#endif
123123
}
124124

125-
Sketch* ConstructClMul5Bytes(int bits, int implementation) {
125+
Sketch* ConstructClMul5Bytes(int bits, int implementation, uint64_t seed) {
126126
switch (bits) {
127127
#ifdef ENABLE_FIELD_INT_33
128-
case 33: return new SketchImpl<Field33>(implementation, 33);
128+
case 33: return new SketchImpl<Field33>(implementation, 33, seed);
129129
#endif
130130
#ifdef ENABLE_FIELD_INT_34
131-
case 34: return new SketchImpl<Field34>(implementation, 34);
131+
case 34: return new SketchImpl<Field34>(implementation, 34, seed);
132132
#endif
133133
#ifdef ENABLE_FIELD_INT_35
134-
case 35: return new SketchImpl<Field35>(implementation, 35);
134+
case 35: return new SketchImpl<Field35>(implementation, 35, seed);
135135
#endif
136136
#ifdef ENABLE_FIELD_INT_36
137-
case 36: return new SketchImpl<Field36>(implementation, 36);
137+
case 36: return new SketchImpl<Field36>(implementation, 36, seed);
138138
#endif
139139
#ifdef ENABLE_FIELD_INT_37
140-
case 37: return new SketchImpl<Field37>(implementation, 37);
140+
case 37: return new SketchImpl<Field37>(implementation, 37, seed);
141141
#endif
142142
#ifdef ENABLE_FIELD_INT_38
143-
case 38: return new SketchImpl<Field38>(implementation, 38);
143+
case 38: return new SketchImpl<Field38>(implementation, 38, seed);
144144
#endif
145145
#ifdef ENABLE_FIELD_INT_39
146-
case 39: return new SketchImpl<Field39>(implementation, 39);
146+
case 39: return new SketchImpl<Field39>(implementation, 39, seed);
147147
#endif
148148
#ifdef ENABLE_FIELD_INT_40
149-
case 40: return new SketchImpl<Field40>(implementation, 40);
149+
case 40: return new SketchImpl<Field40>(implementation, 40, seed);
150150
#endif
151151
}
152152
return nullptr;
153153
}
154154

155-
Sketch* ConstructClMulTri5Bytes(int bits, int implementation) {
155+
Sketch* ConstructClMulTri5Bytes(int bits, int implementation, uint64_t seed) {
156156
switch (bits) {
157157
#ifdef ENABLE_FIELD_INT_33
158-
case 33: return new SketchImpl<FieldTri33>(implementation, 33);
158+
case 33: return new SketchImpl<FieldTri33>(implementation, 33, seed);
159159
#endif
160160
#ifdef ENABLE_FIELD_INT_34
161-
case 34: return new SketchImpl<FieldTri34>(implementation, 34);
161+
case 34: return new SketchImpl<FieldTri34>(implementation, 34, seed);
162162
#endif
163163
#ifdef ENABLE_FIELD_INT_35
164-
case 35: return new SketchImpl<FieldTri35>(implementation, 35);
164+
case 35: return new SketchImpl<FieldTri35>(implementation, 35, seed);
165165
#endif
166166
#ifdef ENABLE_FIELD_INT_36
167-
case 36: return new SketchImpl<FieldTri36>(implementation, 36);
167+
case 36: return new SketchImpl<FieldTri36>(implementation, 36, seed);
168168
#endif
169169
#ifdef ENABLE_FIELD_INT_39
170-
case 39: return new SketchImpl<FieldTri39>(implementation, 39);
170+
case 39: return new SketchImpl<FieldTri39>(implementation, 39, seed);
171171
#endif
172172
}
173173
return nullptr;

‎src/fields/clmul_6bytes.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,49 +121,49 @@ typedef Field<uint64_t, 48, 45, StatTable48, &SQR_TABLE_48, &SQR2_TABLE_48, &SQR
121121
#endif
122122
}
123123

124-
Sketch* ConstructClMul6Bytes(int bits, int implementation) {
124+
Sketch* ConstructClMul6Bytes(int bits, int implementation, uint64_t seed) {
125125
switch (bits) {
126126
#ifdef ENABLE_FIELD_INT_41
127-
case 41: return new SketchImpl<Field41>(implementation, 41);
127+
case 41: return new SketchImpl<Field41>(implementation, 41, seed);
128128
#endif
129129
#ifdef ENABLE_FIELD_INT_42
130-
case 42: return new SketchImpl<Field42>(implementation, 42);
130+
case 42: return new SketchImpl<Field42>(implementation, 42, seed);
131131
#endif
132132
#ifdef ENABLE_FIELD_INT_43
133-
case 43: return new SketchImpl<Field43>(implementation, 43);
133+
case 43: return new SketchImpl<Field43>(implementation, 43, seed);
134134
#endif
135135
#ifdef ENABLE_FIELD_INT_44
136-
case 44: return new SketchImpl<Field44>(implementation, 44);
136+
case 44: return new SketchImpl<Field44>(implementation, 44, seed);
137137
#endif
138138
#ifdef ENABLE_FIELD_INT_45
139-
case 45: return new SketchImpl<Field45>(implementation, 45);
139+
case 45: return new SketchImpl<Field45>(implementation, 45, seed);
140140
#endif
141141
#ifdef ENABLE_FIELD_INT_47
142-
case 47: return new SketchImpl<Field47>(implementation, 47);
142+
case 47: return new SketchImpl<Field47>(implementation, 47, seed);
143143
#endif
144144
#ifdef ENABLE_FIELD_INT_48
145-
case 48: return new SketchImpl<Field48>(implementation, 48);
145+
case 48: return new SketchImpl<Field48>(implementation, 48, seed);
146146
#endif
147147
}
148148
return nullptr;
149149
}
150150

151-
Sketch* ConstructClMulTri6Bytes(int bits, int implementation) {
151+
Sketch* ConstructClMulTri6Bytes(int bits, int implementation, uint64_t seed) {
152152
switch (bits) {
153153
#ifdef ENABLE_FIELD_INT_41
154-
case 41: return new SketchImpl<FieldTri41>(implementation, 41);
154+
case 41: return new SketchImpl<FieldTri41>(implementation, 41, seed);
155155
#endif
156156
#ifdef ENABLE_FIELD_INT_42
157-
case 42: return new SketchImpl<FieldTri42>(implementation, 42);
157+
case 42: return new SketchImpl<FieldTri42>(implementation, 42, seed);
158158
#endif
159159
#ifdef ENABLE_FIELD_INT_44
160-
case 44: return new SketchImpl<FieldTri44>(implementation, 44);
160+
case 44: return new SketchImpl<FieldTri44>(implementation, 44, seed);
161161
#endif
162162
#ifdef ENABLE_FIELD_INT_46
163-
case 46: return new SketchImpl<FieldTri46>(implementation, 46);
163+
case 46: return new SketchImpl<FieldTri46>(implementation, 46, seed);
164164
#endif
165165
#ifdef ENABLE_FIELD_INT_47
166-
case 47: return new SketchImpl<FieldTri47>(implementation, 47);
166+
case 47: return new SketchImpl<FieldTri47>(implementation, 47, seed);
167167
#endif
168168
}
169169
return nullptr;

‎src/fields/clmul_7bytes.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,49 +121,49 @@ typedef Field<uint64_t, 56, 149, StatTable56, &SQR_TABLE_56, &SQR2_TABLE_56, &SQ
121121
#endif
122122
}
123123

124-
Sketch* ConstructClMul7Bytes(int bits, int implementation) {
124+
Sketch* ConstructClMul7Bytes(int bits, int implementation, uint64_t seed) {
125125
switch (bits) {
126126
#ifdef ENABLE_FIELD_INT_49
127-
case 49: return new SketchImpl<Field49>(implementation, 49);
127+
case 49: return new SketchImpl<Field49>(implementation, 49, seed);
128128
#endif
129129
#ifdef ENABLE_FIELD_INT_50
130-
case 50: return new SketchImpl<Field50>(implementation, 50);
130+
case 50: return new SketchImpl<Field50>(implementation, 50, seed);
131131
#endif
132132
#ifdef ENABLE_FIELD_INT_51
133-
case 51: return new SketchImpl<Field51>(implementation, 51);
133+
case 51: return new SketchImpl<Field51>(implementation, 51, seed);
134134
#endif
135135
#ifdef ENABLE_FIELD_INT_52
136-
case 52: return new SketchImpl<Field52>(implementation, 52);
136+
case 52: return new SketchImpl<Field52>(implementation, 52, seed);
137137
#endif
138138
#ifdef ENABLE_FIELD_INT_53
139-
case 53: return new SketchImpl<Field53>(implementation, 53);
139+
case 53: return new SketchImpl<Field53>(implementation, 53, seed);
140140
#endif
141141
#ifdef ENABLE_FIELD_INT_54
142-
case 54: return new SketchImpl<Field54>(implementation, 54);
142+
case 54: return new SketchImpl<Field54>(implementation, 54, seed);
143143
#endif
144144
#ifdef ENABLE_FIELD_INT_55
145-
case 55: return new SketchImpl<Field55>(implementation, 55);
145+
case 55: return new SketchImpl<Field55>(implementation, 55, seed);
146146
#endif
147147
#ifdef ENABLE_FIELD_INT_56
148-
case 56: return new SketchImpl<Field56>(implementation, 56);
148+
case 56: return new SketchImpl<Field56>(implementation, 56, seed);
149149
#endif
150150
}
151151
return nullptr;
152152
}
153153

154-
Sketch* ConstructClMulTri7Bytes(int bits, int implementation) {
154+
Sketch* ConstructClMulTri7Bytes(int bits, int implementation, uint64_t seed) {
155155
switch (bits) {
156156
#ifdef ENABLE_FIELD_INT_49
157-
case 49: return new SketchImpl<FieldTri49>(implementation, 49);
157+
case 49: return new SketchImpl<FieldTri49>(implementation, 49, seed);
158158
#endif
159159
#ifdef ENABLE_FIELD_INT_52
160-
case 52: return new SketchImpl<FieldTri52>(implementation, 52);
160+
case 52: return new SketchImpl<FieldTri52>(implementation, 52, seed);
161161
#endif
162162
#ifdef ENABLE_FIELD_INT_54
163-
case 54: return new SketchImpl<FieldTri54>(implementation, 54);
163+
case 54: return new SketchImpl<FieldTri54>(implementation, 54, seed);
164164
#endif
165165
#ifdef ENABLE_FIELD_INT_55
166-
case 55: return new SketchImpl<FieldTri55>(implementation, 55);
166+
case 55: return new SketchImpl<FieldTri55>(implementation, 55, seed);
167167
#endif
168168
}
169169
return nullptr;

‎src/fields/clmul_8bytes.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -129,46 +129,46 @@ typedef Field<uint64_t, 64, 27, StatTable64, &SQR_TABLE_64, &SQR2_TABLE_64, &SQR
129129
#endif
130130
}
131131

132-
Sketch* ConstructClMul8Bytes(int bits, int implementation) {
132+
Sketch* ConstructClMul8Bytes(int bits, int implementation, uint64_t seed) {
133133
switch (bits) {
134134
#ifdef ENABLE_FIELD_INT_57
135-
case 57: return new SketchImpl<Field57>(implementation, 57);
135+
case 57: return new SketchImpl<Field57>(implementation, 57, seed);
136136
#endif
137137
#ifdef ENABLE_FIELD_INT_58
138-
case 58: return new SketchImpl<Field58>(implementation, 58);
138+
case 58: return new SketchImpl<Field58>(implementation, 58, seed);
139139
#endif
140140
#ifdef ENABLE_FIELD_INT_59
141-
case 59: return new SketchImpl<Field59>(implementation, 59);
141+
case 59: return new SketchImpl<Field59>(implementation, 59, seed);
142142
#endif
143143
#ifdef ENABLE_FIELD_INT_61
144-
case 61: return new SketchImpl<Field61>(implementation, 61);
144+
case 61: return new SketchImpl<Field61>(implementation, 61, seed);
145145
#endif
146146
#ifdef ENABLE_FIELD_INT_62
147-
case 62: return new SketchImpl<Field62>(implementation, 62);
147+
case 62: return new SketchImpl<Field62>(implementation, 62, seed);
148148
#endif
149149
#ifdef ENABLE_FIELD_INT_64
150-
case 64: return new SketchImpl<Field64>(implementation, 64);
150+
case 64: return new SketchImpl<Field64>(implementation, 64, seed);
151151
#endif
152152
}
153153
return nullptr;
154154
}
155155

156-
Sketch* ConstructClMulTri8Bytes(int bits, int implementation) {
156+
Sketch* ConstructClMulTri8Bytes(int bits, int implementation, uint64_t seed) {
157157
switch (bits) {
158158
#ifdef ENABLE_FIELD_INT_57
159-
case 57: return new SketchImpl<FieldTri57>(implementation, 57);
159+
case 57: return new SketchImpl<FieldTri57>(implementation, 57, seed);
160160
#endif
161161
#ifdef ENABLE_FIELD_INT_58
162-
case 58: return new SketchImpl<FieldTri58>(implementation, 58);
162+
case 58: return new SketchImpl<FieldTri58>(implementation, 58, seed);
163163
#endif
164164
#ifdef ENABLE_FIELD_INT_60
165-
case 60: return new SketchImpl<FieldTri60>(implementation, 60);
165+
case 60: return new SketchImpl<FieldTri60>(implementation, 60, seed);
166166
#endif
167167
#ifdef ENABLE_FIELD_INT_62
168-
case 62: return new SketchImpl<FieldTri62>(implementation, 62);
168+
case 62: return new SketchImpl<FieldTri62>(implementation, 62, seed);
169169
#endif
170170
#ifdef ENABLE_FIELD_INT_63
171-
case 63: return new SketchImpl<FieldTri63>(implementation, 63);
171+
case 63: return new SketchImpl<FieldTri63>(implementation, 63, seed);
172172
#endif
173173
}
174174
return nullptr;

‎src/fields/generic_1byte.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,29 +83,29 @@ typedef Field<uint8_t, 8, 27, StatTable8, DynTable8, &SQR_TABLE_8, &QRT_TABLE_8>
8383
#endif
8484
}
8585

86-
Sketch* ConstructGeneric1Byte(int bits, int implementation)
86+
Sketch* ConstructGeneric1Byte(int bits, int implementation, uint64_t seed)
8787
{
8888
switch (bits) {
8989
#ifdef ENABLE_FIELD_INT_2
90-
case 2: return new SketchImpl<Field2>(implementation, 2);
90+
case 2: return new SketchImpl<Field2>(implementation, 2, seed);
9191
#endif
9292
#ifdef ENABLE_FIELD_INT_3
93-
case 3: return new SketchImpl<Field3>(implementation, 3);
93+
case 3: return new SketchImpl<Field3>(implementation, 3, seed);
9494
#endif
9595
#ifdef ENABLE_FIELD_INT_4
96-
case 4: return new SketchImpl<Field4>(implementation, 4);
96+
case 4: return new SketchImpl<Field4>(implementation, 4, seed);
9797
#endif
9898
#ifdef ENABLE_FIELD_INT_5
99-
case 5: return new SketchImpl<Field5>(implementation, 5);
99+
case 5: return new SketchImpl<Field5>(implementation, 5, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_6
102-
case 6: return new SketchImpl<Field6>(implementation, 6);
102+
case 6: return new SketchImpl<Field6>(implementation, 6, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_7
105-
case 7: return new SketchImpl<Field7>(implementation, 7);
105+
case 7: return new SketchImpl<Field7>(implementation, 7, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_8
108-
case 8: return new SketchImpl<Field8>(implementation, 8);
108+
case 8: return new SketchImpl<Field8>(implementation, 8, seed);
109109
#endif
110110
default: return nullptr;
111111
}

‎src/fields/generic_2bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint16_t, 16, 43, StatTable16, DynTable16, &SQR_TABLE_16, &QRT_TAB
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric2Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric2Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_9
99-
case 9: return new SketchImpl<Field9>(implementation, 9);
99+
case 9: return new SketchImpl<Field9>(implementation, 9, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_10
102-
case 10: return new SketchImpl<Field10>(implementation, 10);
102+
case 10: return new SketchImpl<Field10>(implementation, 10, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_11
105-
case 11: return new SketchImpl<Field11>(implementation, 11);
105+
case 11: return new SketchImpl<Field11>(implementation, 11, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_12
108-
case 12: return new SketchImpl<Field12>(implementation, 12);
108+
case 12: return new SketchImpl<Field12>(implementation, 12, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_13
111-
case 13: return new SketchImpl<Field13>(implementation, 13);
111+
case 13: return new SketchImpl<Field13>(implementation, 13, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_14
114-
case 14: return new SketchImpl<Field14>(implementation, 14);
114+
case 14: return new SketchImpl<Field14>(implementation, 14, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_15
117-
case 15: return new SketchImpl<Field15>(implementation, 15);
117+
case 15: return new SketchImpl<Field15>(implementation, 15, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_16
120-
case 16: return new SketchImpl<Field16>(implementation, 16);
120+
case 16: return new SketchImpl<Field16>(implementation, 16, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_3bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint32_t, 24, 27, StatTable24, DynTable24, &SQR_TABLE_24, &QRT_TAB
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric3Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric3Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_17
99-
case 17: return new SketchImpl<Field17>(implementation, 17);
99+
case 17: return new SketchImpl<Field17>(implementation, 17, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_18
102-
case 18: return new SketchImpl<Field18>(implementation, 18);
102+
case 18: return new SketchImpl<Field18>(implementation, 18, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_19
105-
case 19: return new SketchImpl<Field19>(implementation, 19);
105+
case 19: return new SketchImpl<Field19>(implementation, 19, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_20
108-
case 20: return new SketchImpl<Field20>(implementation, 20);
108+
case 20: return new SketchImpl<Field20>(implementation, 20, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_21
111-
case 21: return new SketchImpl<Field21>(implementation, 21);
111+
case 21: return new SketchImpl<Field21>(implementation, 21, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_22
114-
case 22: return new SketchImpl<Field22>(implementation, 22);
114+
case 22: return new SketchImpl<Field22>(implementation, 22, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_23
117-
case 23: return new SketchImpl<Field23>(implementation, 23);
117+
case 23: return new SketchImpl<Field23>(implementation, 23, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_24
120-
case 24: return new SketchImpl<Field24>(implementation, 24);
120+
case 24: return new SketchImpl<Field24>(implementation, 24, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_4bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint32_t, 32, 141, StatTable32, DynTable32, &SQR_TABLE_32, &QRT_TA
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric4Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric4Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_25
99-
case 25: return new SketchImpl<Field25>(implementation, 25);
99+
case 25: return new SketchImpl<Field25>(implementation, 25, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_26
102-
case 26: return new SketchImpl<Field26>(implementation, 26);
102+
case 26: return new SketchImpl<Field26>(implementation, 26, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_27
105-
case 27: return new SketchImpl<Field27>(implementation, 27);
105+
case 27: return new SketchImpl<Field27>(implementation, 27, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_28
108-
case 28: return new SketchImpl<Field28>(implementation, 28);
108+
case 28: return new SketchImpl<Field28>(implementation, 28, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_29
111-
case 29: return new SketchImpl<Field29>(implementation, 29);
111+
case 29: return new SketchImpl<Field29>(implementation, 29, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_30
114-
case 30: return new SketchImpl<Field30>(implementation, 30);
114+
case 30: return new SketchImpl<Field30>(implementation, 30, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_31
117-
case 31: return new SketchImpl<Field31>(implementation, 31);
117+
case 31: return new SketchImpl<Field31>(implementation, 31, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_32
120-
case 32: return new SketchImpl<Field32>(implementation, 32);
120+
case 32: return new SketchImpl<Field32>(implementation, 32, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_5bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint64_t, 40, 57, StatTable40, DynTable40, &SQR_TABLE_40, &QRT_TAB
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric5Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric5Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_33
99-
case 33: return new SketchImpl<Field33>(implementation, 33);
99+
case 33: return new SketchImpl<Field33>(implementation, 33, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_34
102-
case 34: return new SketchImpl<Field34>(implementation, 34);
102+
case 34: return new SketchImpl<Field34>(implementation, 34, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_35
105-
case 35: return new SketchImpl<Field35>(implementation, 35);
105+
case 35: return new SketchImpl<Field35>(implementation, 35, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_36
108-
case 36: return new SketchImpl<Field36>(implementation, 36);
108+
case 36: return new SketchImpl<Field36>(implementation, 36, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_37
111-
case 37: return new SketchImpl<Field37>(implementation, 37);
111+
case 37: return new SketchImpl<Field37>(implementation, 37, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_38
114-
case 38: return new SketchImpl<Field38>(implementation, 38);
114+
case 38: return new SketchImpl<Field38>(implementation, 38, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_39
117-
case 39: return new SketchImpl<Field39>(implementation, 39);
117+
case 39: return new SketchImpl<Field39>(implementation, 39, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_40
120-
case 40: return new SketchImpl<Field40>(implementation, 40);
120+
case 40: return new SketchImpl<Field40>(implementation, 40, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_6bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint64_t, 48, 45, StatTable48, DynTable48, &SQR_TABLE_48, &QRT_TAB
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric6Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric6Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_41
99-
case 41: return new SketchImpl<Field41>(implementation, 41);
99+
case 41: return new SketchImpl<Field41>(implementation, 41, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_42
102-
case 42: return new SketchImpl<Field42>(implementation, 42);
102+
case 42: return new SketchImpl<Field42>(implementation, 42, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_43
105-
case 43: return new SketchImpl<Field43>(implementation, 43);
105+
case 43: return new SketchImpl<Field43>(implementation, 43, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_44
108-
case 44: return new SketchImpl<Field44>(implementation, 44);
108+
case 44: return new SketchImpl<Field44>(implementation, 44, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_45
111-
case 45: return new SketchImpl<Field45>(implementation, 45);
111+
case 45: return new SketchImpl<Field45>(implementation, 45, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_46
114-
case 46: return new SketchImpl<Field46>(implementation, 46);
114+
case 46: return new SketchImpl<Field46>(implementation, 46, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_47
117-
case 47: return new SketchImpl<Field47>(implementation, 47);
117+
case 47: return new SketchImpl<Field47>(implementation, 47, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_48
120-
case 48: return new SketchImpl<Field48>(implementation, 48);
120+
case 48: return new SketchImpl<Field48>(implementation, 48, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_7bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint64_t, 56, 149, StatTable56, DynTable56, &SQR_TABLE_56, &QRT_TA
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric7Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric7Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_49
99-
case 49: return new SketchImpl<Field49>(implementation, 49);
99+
case 49: return new SketchImpl<Field49>(implementation, 49, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_50
102-
case 50: return new SketchImpl<Field50>(implementation, 50);
102+
case 50: return new SketchImpl<Field50>(implementation, 50, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_51
105-
case 51: return new SketchImpl<Field51>(implementation, 51);
105+
case 51: return new SketchImpl<Field51>(implementation, 51, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_52
108-
case 52: return new SketchImpl<Field52>(implementation, 52);
108+
case 52: return new SketchImpl<Field52>(implementation, 52, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_53
111-
case 53: return new SketchImpl<Field53>(implementation, 53);
111+
case 53: return new SketchImpl<Field53>(implementation, 53, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_54
114-
case 54: return new SketchImpl<Field54>(implementation, 54);
114+
case 54: return new SketchImpl<Field54>(implementation, 54, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_55
117-
case 55: return new SketchImpl<Field55>(implementation, 55);
117+
case 55: return new SketchImpl<Field55>(implementation, 55, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_56
120-
case 56: return new SketchImpl<Field56>(implementation, 56);
120+
case 56: return new SketchImpl<Field56>(implementation, 56, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/fields/generic_8bytes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,32 @@ typedef Field<uint64_t, 64, 27, StatTable64, DynTable64, &SQR_TABLE_64, &QRT_TAB
9292
#endif
9393
}
9494

95-
Sketch* ConstructGeneric8Bytes(int bits, int implementation)
95+
Sketch* ConstructGeneric8Bytes(int bits, int implementation, uint64_t seed)
9696
{
9797
switch (bits) {
9898
#ifdef ENABLE_FIELD_INT_57
99-
case 57: return new SketchImpl<Field57>(implementation, 57);
99+
case 57: return new SketchImpl<Field57>(implementation, 57, seed);
100100
#endif
101101
#ifdef ENABLE_FIELD_INT_58
102-
case 58: return new SketchImpl<Field58>(implementation, 58);
102+
case 58: return new SketchImpl<Field58>(implementation, 58, seed);
103103
#endif
104104
#ifdef ENABLE_FIELD_INT_59
105-
case 59: return new SketchImpl<Field59>(implementation, 59);
105+
case 59: return new SketchImpl<Field59>(implementation, 59, seed);
106106
#endif
107107
#ifdef ENABLE_FIELD_INT_60
108-
case 60: return new SketchImpl<Field60>(implementation, 60);
108+
case 60: return new SketchImpl<Field60>(implementation, 60, seed);
109109
#endif
110110
#ifdef ENABLE_FIELD_INT_61
111-
case 61: return new SketchImpl<Field61>(implementation, 61);
111+
case 61: return new SketchImpl<Field61>(implementation, 61, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_62
114-
case 62: return new SketchImpl<Field62>(implementation, 62);
114+
case 62: return new SketchImpl<Field62>(implementation, 62, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_63
117-
case 63: return new SketchImpl<Field63>(implementation, 63);
117+
case 63: return new SketchImpl<Field63>(implementation, 63, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_64
120-
case 64: return new SketchImpl<Field64>(implementation, 64);
120+
case 64: return new SketchImpl<Field64>(implementation, 64, seed);
121121
#endif
122122
default: return nullptr;
123123
}

‎src/minisketch.cpp

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,32 @@
2525
# endif
2626
#endif
2727

28-
Sketch* ConstructGeneric1Byte(int bits, int implementation);
29-
Sketch* ConstructGeneric2Bytes(int bits, int implementation);
30-
Sketch* ConstructGeneric3Bytes(int bits, int implementation);
31-
Sketch* ConstructGeneric4Bytes(int bits, int implementation);
32-
Sketch* ConstructGeneric5Bytes(int bits, int implementation);
33-
Sketch* ConstructGeneric6Bytes(int bits, int implementation);
34-
Sketch* ConstructGeneric7Bytes(int bits, int implementation);
35-
Sketch* ConstructGeneric8Bytes(int bits, int implementation);
28+
Sketch* ConstructGeneric1Byte(int bits, int implementation, uint64_t seed);
29+
Sketch* ConstructGeneric2Bytes(int bits, int implementation, uint64_t seed);
30+
Sketch* ConstructGeneric3Bytes(int bits, int implementation, uint64_t seed);
31+
Sketch* ConstructGeneric4Bytes(int bits, int implementation, uint64_t seed);
32+
Sketch* ConstructGeneric5Bytes(int bits, int implementation, uint64_t seed);
33+
Sketch* ConstructGeneric6Bytes(int bits, int implementation, uint64_t seed);
34+
Sketch* ConstructGeneric7Bytes(int bits, int implementation, uint64_t seed);
35+
Sketch* ConstructGeneric8Bytes(int bits, int implementation, uint64_t seed);
3636

3737
#ifdef HAVE_CLMUL
38-
Sketch* ConstructClMul1Byte(int bits, int implementation);
39-
Sketch* ConstructClMul2Bytes(int bits, int implementation);
40-
Sketch* ConstructClMul3Bytes(int bits, int implementation);
41-
Sketch* ConstructClMul4Bytes(int bits, int implementation);
42-
Sketch* ConstructClMul5Bytes(int bits, int implementation);
43-
Sketch* ConstructClMul6Bytes(int bits, int implementation);
44-
Sketch* ConstructClMul7Bytes(int bits, int implementation);
45-
Sketch* ConstructClMul8Bytes(int bits, int implementation);
46-
Sketch* ConstructClMulTri1Byte(int bits, int implementation);
47-
Sketch* ConstructClMulTri2Bytes(int bits, int implementation);
48-
Sketch* ConstructClMulTri3Bytes(int bits, int implementation);
49-
Sketch* ConstructClMulTri4Bytes(int bits, int implementation);
50-
Sketch* ConstructClMulTri5Bytes(int bits, int implementation);
51-
Sketch* ConstructClMulTri6Bytes(int bits, int implementation);
52-
Sketch* ConstructClMulTri7Bytes(int bits, int implementation);
53-
Sketch* ConstructClMulTri8Bytes(int bits, int implementation);
38+
Sketch* ConstructClMul1Byte(int bits, int implementation, uint64_t seed);
39+
Sketch* ConstructClMul2Bytes(int bits, int implementation, uint64_t seed);
40+
Sketch* ConstructClMul3Bytes(int bits, int implementation, uint64_t seed);
41+
Sketch* ConstructClMul4Bytes(int bits, int implementation, uint64_t seed);
42+
Sketch* ConstructClMul5Bytes(int bits, int implementation, uint64_t seed);
43+
Sketch* ConstructClMul6Bytes(int bits, int implementation, uint64_t seed);
44+
Sketch* ConstructClMul7Bytes(int bits, int implementation, uint64_t seed);
45+
Sketch* ConstructClMul8Bytes(int bits, int implementation, uint64_t seed);
46+
Sketch* ConstructClMulTri1Byte(int bits, int implementation, uint64_t seed);
47+
Sketch* ConstructClMulTri2Bytes(int bits, int implementation, uint64_t seed);
48+
Sketch* ConstructClMulTri3Bytes(int bits, int implementation, uint64_t seed);
49+
Sketch* ConstructClMulTri4Bytes(int bits, int implementation, uint64_t seed);
50+
Sketch* ConstructClMulTri5Bytes(int bits, int implementation, uint64_t seed);
51+
Sketch* ConstructClMulTri6Bytes(int bits, int implementation, uint64_t seed);
52+
Sketch* ConstructClMulTri7Bytes(int bits, int implementation, uint64_t seed);
53+
Sketch* ConstructClMulTri8Bytes(int bits, int implementation, uint64_t seed);
5454
#endif
5555

5656
namespace {
@@ -77,27 +77,27 @@ static inline bool EnableClmul()
7777
}
7878
#endif
7979

80-
Sketch* Construct(int bits, int impl)
80+
Sketch* Construct(int bits, int impl, uint64_t seed)
8181
{
8282
switch (FieldImpl(impl)) {
8383
case FieldImpl::GENERIC:
8484
switch ((bits + 7) / 8) {
8585
case 1:
86-
return ConstructGeneric1Byte(bits, impl);
86+
return ConstructGeneric1Byte(bits, impl, seed);
8787
case 2:
88-
return ConstructGeneric2Bytes(bits, impl);
88+
return ConstructGeneric2Bytes(bits, impl, seed);
8989
case 3:
90-
return ConstructGeneric3Bytes(bits, impl);
90+
return ConstructGeneric3Bytes(bits, impl, seed);
9191
case 4:
92-
return ConstructGeneric4Bytes(bits, impl);
92+
return ConstructGeneric4Bytes(bits, impl, seed);
9393
case 5:
94-
return ConstructGeneric5Bytes(bits, impl);
94+
return ConstructGeneric5Bytes(bits, impl, seed);
9595
case 6:
96-
return ConstructGeneric6Bytes(bits, impl);
96+
return ConstructGeneric6Bytes(bits, impl, seed);
9797
case 7:
98-
return ConstructGeneric7Bytes(bits, impl);
98+
return ConstructGeneric7Bytes(bits, impl, seed);
9999
case 8:
100-
return ConstructGeneric8Bytes(bits, impl);
100+
return ConstructGeneric8Bytes(bits, impl, seed);
101101
default:
102102
return nullptr;
103103
}
@@ -107,21 +107,21 @@ Sketch* Construct(int bits, int impl)
107107
if (EnableClmul()) {
108108
switch ((bits + 7) / 8) {
109109
case 1:
110-
return ConstructClMul1Byte(bits, impl);
110+
return ConstructClMul1Byte(bits, impl, seed);
111111
case 2:
112-
return ConstructClMul2Bytes(bits, impl);
112+
return ConstructClMul2Bytes(bits, impl, seed);
113113
case 3:
114-
return ConstructClMul3Bytes(bits, impl);
114+
return ConstructClMul3Bytes(bits, impl, seed);
115115
case 4:
116-
return ConstructClMul4Bytes(bits, impl);
116+
return ConstructClMul4Bytes(bits, impl, seed);
117117
case 5:
118-
return ConstructClMul5Bytes(bits, impl);
118+
return ConstructClMul5Bytes(bits, impl, seed);
119119
case 6:
120-
return ConstructClMul6Bytes(bits, impl);
120+
return ConstructClMul6Bytes(bits, impl, seed);
121121
case 7:
122-
return ConstructClMul7Bytes(bits, impl);
122+
return ConstructClMul7Bytes(bits, impl, seed);
123123
case 8:
124-
return ConstructClMul8Bytes(bits, impl);
124+
return ConstructClMul8Bytes(bits, impl, seed);
125125
default:
126126
return nullptr;
127127
}
@@ -131,21 +131,21 @@ Sketch* Construct(int bits, int impl)
131131
if (EnableClmul()) {
132132
switch ((bits + 7) / 8) {
133133
case 1:
134-
return ConstructClMulTri1Byte(bits, impl);
134+
return ConstructClMulTri1Byte(bits, impl, seed);
135135
case 2:
136-
return ConstructClMulTri2Bytes(bits, impl);
136+
return ConstructClMulTri2Bytes(bits, impl, seed);
137137
case 3:
138-
return ConstructClMulTri3Bytes(bits, impl);
138+
return ConstructClMulTri3Bytes(bits, impl, seed);
139139
case 4:
140-
return ConstructClMulTri4Bytes(bits, impl);
140+
return ConstructClMulTri4Bytes(bits, impl, seed);
141141
case 5:
142-
return ConstructClMulTri5Bytes(bits, impl);
142+
return ConstructClMulTri5Bytes(bits, impl, seed);
143143
case 6:
144-
return ConstructClMulTri6Bytes(bits, impl);
144+
return ConstructClMulTri6Bytes(bits, impl, seed);
145145
case 7:
146-
return ConstructClMulTri7Bytes(bits, impl);
146+
return ConstructClMulTri7Bytes(bits, impl, seed);
147147
case 8:
148-
return ConstructClMulTri8Bytes(bits, impl);
148+
return ConstructClMulTri8Bytes(bits, impl, seed);
149149
default:
150150
return nullptr;
151151
}
@@ -366,7 +366,7 @@ int minisketch_implementation_supported(uint32_t bits, uint32_t implementation)
366366
return 0;
367367
}
368368
try {
369-
Sketch* sketch = Construct(bits, implementation);
369+
Sketch* sketch = Construct(bits, implementation, 0);
370370
if (sketch) {
371371
delete sketch;
372372
return 1;
@@ -375,9 +375,9 @@ int minisketch_implementation_supported(uint32_t bits, uint32_t implementation)
375375
return 0;
376376
}
377377

378-
minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity) {
378+
minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity, uint64_t seed) {
379379
try {
380-
Sketch* sketch = Construct(bits, implementation);
380+
Sketch* sketch = Construct(bits, implementation, seed);
381381
if (sketch) {
382382
try {
383383
sketch->Init(capacity);
@@ -414,10 +414,8 @@ uint32_t minisketch_implementation(const minisketch* sketch) {
414414
minisketch* minisketch_clone(const minisketch* sketch) {
415415
const Sketch* s = (const Sketch*)sketch;
416416
s->Check();
417-
Sketch* r = (Sketch*) minisketch_create(s->Bits(), s->Implementation(), s->Syndromes());
418-
if (r) {
419-
r->Merge(s);
420-
}
417+
Sketch* r = s->Clone();
418+
r->Check();
421419
return (minisketch*) r;
422420
}
423421

‎src/sketch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class Sketch
3535
virtual void Deserialize(const unsigned char*) = 0;
3636
virtual size_t Merge(const Sketch* other_sketch) = 0;
3737
virtual void SetSeed(uint64_t seed) = 0;
38+
virtual Sketch* Clone() const = 0;
3839

3940
virtual int Decode(int max_count, uint64_t* roots) const = 0;
4041
};

‎src/sketch_impl.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,12 @@ class SketchImpl final : public Sketch
360360

361361
public:
362362
template<typename... Args>
363-
SketchImpl(int implementation, int bits, const Args&... args) : Sketch(implementation, bits), m_field(args...) {
364-
std::random_device rng;
365-
std::uniform_int_distribution<uint64_t> dist;
366-
m_basis = m_field.FromSeed(dist(rng));
363+
SketchImpl(int implementation, int bits, uint64_t seed, const Args&... args) : Sketch(implementation, bits), m_field(args...) {
364+
m_basis = m_field.FromSeed(seed);
367365
}
368366

367+
SketchImpl(const SketchImpl& other) = default;
368+
369369
size_t Syndromes() const override { return m_syndromes.size(); }
370370
void Init(size_t count) override { m_syndromes.assign(count, 0); }
371371

@@ -429,6 +429,11 @@ class SketchImpl final : public Sketch
429429
m_basis = m_field.FromSeed(seed);
430430
}
431431
}
432+
433+
Sketch* Clone() const override
434+
{
435+
return new SketchImpl<F>(*this);
436+
}
432437
};
433438

434439
#endif

‎src/test.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ uint64_t Combination(uint64_t n, uint64_t k) {
2828
}
2929

3030
/** Create a vector with Minisketch objects, one for each implementation. */
31-
std::vector<Minisketch> CreateSketches(uint32_t bits, size_t capacity) {
31+
std::vector<Minisketch> CreateSketches(uint32_t bits, size_t capacity, uint64_t seed) {
3232
if (!Minisketch::BitsSupported(bits)) return {};
3333
std::vector<Minisketch> ret;
3434
for (uint32_t impl = 0; impl <= Minisketch::MaxImplementation(); ++impl) {
3535
if (Minisketch::ImplementationSupported(bits, impl)) {
3636
CHECK(Minisketch::BitsSupported(bits));
37-
ret.push_back(Minisketch(bits, impl, capacity));
37+
ret.push_back(Minisketch(bits, impl, capacity, seed));
3838
CHECK((bool)ret.back());
3939
} else {
4040
// implementation 0 must always work unless field size is disabled
@@ -46,10 +46,10 @@ std::vector<Minisketch> CreateSketches(uint32_t bits, size_t capacity) {
4646

4747
/** Test properties by exhaustively decoding all 2**(bits*capacity) sketches
4848
* with specified capacity and bits. */
49-
void TestExhaustive(uint32_t bits, size_t capacity) {
50-
auto sketches = CreateSketches(bits, capacity);
49+
void TestExhaustive(uint32_t bits, size_t capacity, uint64_t seed) {
50+
auto sketches = CreateSketches(bits, capacity, seed);
5151
if (sketches.empty()) return;
52-
auto sketches_rebuild = CreateSketches(bits, capacity);
52+
auto sketches_rebuild = CreateSketches(bits, capacity, seed + 1);
5353

5454
std::vector<unsigned char> serialized;
5555
std::vector<unsigned char> serialized_empty;
@@ -125,6 +125,7 @@ void TestExhaustive(uint32_t bits, size_t capacity) {
125125
/** Test properties of sketches with random elements put in. */
126126
void TestRandomized(uint32_t bits, size_t max_capacity, size_t iter) {
127127
std::random_device rnd;
128+
std::uniform_int_distribution<uint64_t> seed_dist;
128129
std::uniform_int_distribution<uint64_t> capacity_dist(0, std::min<uint64_t>(std::numeric_limits<uint64_t>::max() >> (64 - bits), max_capacity));
129130
std::uniform_int_distribution<uint64_t> element_dist(1, std::numeric_limits<uint64_t>::max() >> (64 - bits));
130131
std::uniform_int_distribution<uint64_t> rand64(0, std::numeric_limits<uint64_t>::max());
@@ -138,7 +139,7 @@ void TestRandomized(uint32_t bits, size_t max_capacity, size_t iter) {
138139
for (size_t i = 0; i < iter; ++i) {
139140
// Determine capacity, and construct Minisketch objects for all implementations.
140141
uint64_t capacity = capacity_dist(rnd);
141-
auto sketches = CreateSketches(bits, capacity);
142+
auto sketches = CreateSketches(bits, capacity, seed_dist(rnd));
142143
// Sanity checks
143144
if (sketches.empty()) return;
144145
for (size_t impl = 0; impl < sketches.size(); ++impl) {
@@ -268,6 +269,8 @@ void TestComputeFunctions() {
268269
} // namespace
269270

270271
int main(int argc, char** argv) {
272+
std::random_device rnd;
273+
std::uniform_int_distribution<uint64_t> seed_dist;
271274
uint64_t test_complexity = 4;
272275
if (argc > 1) {
273276
size_t len = 0;
@@ -307,7 +310,7 @@ int main(int argc, char** argv) {
307310
for (int bits = 2; weight == 0 ? bits <= 64 : (bits <= 32 && bits <= weight); ++bits) {
308311
int capacity = weight / bits;
309312
if (capacity * bits != weight) continue;
310-
TestExhaustive(bits, capacity);
313+
TestExhaustive(bits, capacity, seed_dist(rnd));
311314
}
312315
if (weight >= 16 && test_complexity >> (weight - 16) == 0) break;
313316
}

0 commit comments

Comments
 (0)
Please sign in to comment.