Приходит HTTP запрос, формирую строку для сохранения в БД, генерирую уникальный ID так:

```
func NewID() (ulid.ULID, error) {
entropy := rand.New(rand.NewSource(time.Now().UnixNano()))
ms := ulid.Timestamp(time.Now())
return ulid.New(ms, entropy)
}
```

Т.е. ulid.New в качестве энтропии использует рандом у которого в качестве источника энтропии время с наносекундами. Какова вероятность того, что прийдут два запроса в одну наносекунду и возникнет конфликт ID-шников?

Читать далее...
#golang

А какова вероятность, что каждый пятый запрос будет попадать в одну наносекунду?

Вероятность 0. Я так думал. Ну на #Linux - точно ноль.

У коллеги на макбуке таки начались проблемы, коллизии. Один из пяти запросов каждый раз попадает в наносекунду с предыдущим.

Далее...

Я уже ради смеха пишу тупенькую функцию:

```
func main() {
    for range 10 {
        nano := time.Now().UnixNano()
        fmt.Println(nano)
    }
}
```

Запускаю, на Линуксе аутпут ожидаемый:
1773670160067737730
1773670160067773397
1773670160067776893
1773670160067778897
...

Но на макосе... Мама дорогая

1773670384524134000
1773670384524135000
1773670384524135000
1773670384524136000
1773670384524137000
1773670384524138000
1773670384524138000
1773670384524139000

Короче ну его нахуй это ваше айти. Буду проституткой.

Сделал энтропию глобальной переменной, инициализируемой на старте приложения - всё прошло. Мой косяк, наверное. Но кто бы мог подумать...