(base_seed, worker_id)
| 181 | # seed and algorithm for `numpy.random` and `random` modules. |
| 182 | # TODO: Implement `SeedSequence` like object for `flow.random` |
| 183 | def _generate_state(base_seed, worker_id): |
| 184 | INIT_A = 0x43B0D7E5 |
| 185 | MULT_A = 0x931E8875 |
| 186 | INIT_B = 0x8B51F9DD |
| 187 | MULT_B = 0x58F38DED |
| 188 | MIX_MULT_L = 0xCA01F9DD |
| 189 | MIX_MULT_R = 0x4973F715 |
| 190 | XSHIFT = 4 * 8 // 2 |
| 191 | MASK32 = 0xFFFFFFFF |
| 192 | |
| 193 | entropy = [worker_id, base_seed & MASK32, base_seed >> 32, 0] |
| 194 | pool = [0] * 4 |
| 195 | |
| 196 | hash_const_A = INIT_A |
| 197 | |
| 198 | def hash(value): |
| 199 | nonlocal hash_const_A |
| 200 | value = (value ^ hash_const_A) & MASK32 |
| 201 | hash_const_A = (hash_const_A * MULT_A) & MASK32 |
| 202 | value = (value * hash_const_A) & MASK32 |
| 203 | value = (value ^ (value >> XSHIFT)) & MASK32 |
| 204 | return value |
| 205 | |
| 206 | def mix(x, y): |
| 207 | result_x = (MIX_MULT_L * x) & MASK32 |
| 208 | result_y = (MIX_MULT_R * y) & MASK32 |
| 209 | result = (result_x - result_y) & MASK32 |
| 210 | result = (result ^ (result >> XSHIFT)) & MASK32 |
| 211 | return result |
| 212 | |
| 213 | # Add in the entropy to the pool. |
| 214 | for i in range(len(pool)): |
| 215 | pool[i] = hash(entropy[i]) |
| 216 | |
| 217 | # Mix all bits together so late bits can affect earlier bits. |
| 218 | for i_src in range(len(pool)): |
| 219 | for i_dst in range(len(pool)): |
| 220 | if i_src != i_dst: |
| 221 | pool[i_dst] = mix(pool[i_dst], hash(pool[i_src])) |
| 222 | |
| 223 | hash_const_B = INIT_B |
| 224 | state = [] |
| 225 | for i_dst in range(4): |
| 226 | data_val = pool[i_dst] |
| 227 | data_val = (data_val ^ hash_const_B) & MASK32 |
| 228 | hash_const_B = (hash_const_B * MULT_B) & MASK32 |
| 229 | data_val = (data_val * hash_const_B) & MASK32 |
| 230 | data_val = (data_val ^ (data_val >> XSHIFT)) & MASK32 |
| 231 | state.append(data_val) |
| 232 | return state |
| 233 | |
| 234 | |
| 235 | def _worker_loop( |
no test coverage detected