Почему UUID4 дублируется при генерации в нескольких процессах? - PullRequest
2 голосов
/ 14 марта 2019

Использование macOS Mojave & Python 3.6.4.

Я попытался сгенерировать огромное количество uuid4s, которые, как я ожидаю, почти никогда не будут дублироваться при использовании нескольких процессов и uuid4 в Python3.Мой код ниже:

from multiprocessing import Pool
import pandas as pd
from uuid import uuid4


for m in range(5):
    def insert_uuid(n):
        df = pd.DataFrame()
        df['uuid'] = [uuid4() for _ in range(1000000)]
        df.to_csv('uuid_{}.csv'.format(m), mode='a', index=False)
        print(m, n)
    p = Pool(4)
    p.map(insert_uuid, range(100))

Я вставил эти данные (500M записей) в RDB (BigQuery) и посчитал их.Запрос и его результат приведены ниже:

with all_data as (
  select uuid from `test_dataset.uuid_0` union all
  select uuid from `test_dataset.uuid_1` union all
  select uuid from `test_dataset.uuid_2` union all
  select uuid from `test_dataset.uuid_3` union all
  select uuid from `test_dataset.uuid_4`
)
select count(1) as count, count(distinct(all_data.uuid)) as uniq, count(1) - count(distinct(all_data.uuid)) as diff from all_data

Результат

|   count   |   uniq    |  diff |  
|-----------|-----------|-------|
| 500000000 | 499979736 | 20264 |  

Странно, что до 0,0041% дубликатов uuids дублируется.Я знаю, что очень мало шансов, что UUID4 дублирует.

Почему это происходит?Я думаю, что это связано с генерацией случайных чисел в ОС.

...