Я придумал подход Монте-Карло, чтобы иметь возможность безопасно спать при использовании UUID для распределенных систем, которые должны сериализоваться без коллизий.
from random import randint
from math import log
from collections import Counter
def colltest(exp):
uniques = []
while True:
r = randint(0,2**exp)
if r in uniques:
return log(len(uniques) + 1, 2)
uniques.append(r)
for k,v in Counter([colltest(20) for i in xrange(1000)]):
print k, "hash orders of magnitude events before collission:",v
напечатает что-то вроде:
5 hash orders of magnitude events before collission: 1
6 hash orders of magnitude events before collission: 5
7 hash orders of magnitude events before collission: 21
8 hash orders of magnitude events before collission: 91
9 hash orders of magnitude events before collission: 274
10 hash orders of magnitude events before collission: 469
11 hash orders of magnitude events before collission: 138
12 hash orders of magnitude events before collission: 1
Ранее я слышал формулу: если вам нужно сохранить ключи журнала (x / 2), используйте функцию хеширования, которая имеет по крайней мере пространство клавиш e ** (x).
Повторные эксперименты показывают, что для популяции из 1000 пространств log-20 иногда возникает столкновение уже при log (x / 4).
Для uuid4, который составляет 122 бита, это означает, что я сплю безопасно, в то время как несколько компьютеров выбирают случайные uuid, пока у меня не будет около 2 ** 31 элементов. Пиковые транзакции в системе, о которых я думаю, составляют примерно 10-20 событий в секунду, я предполагаю среднее значение 7. Это дает мне операционное окно примерно 10 лет, учитывая эту крайнюю паранойю.