Wpis z mikrobloga

**Mireczki, jak generujecie ID(nie chodzi o auto_increment) w bazach NoSQL/rozproszonych bazach danych? ( ͡° ͜ʖ ͡°)**

Podoba mi się Twitter Snowflake(Scala, ale jest wiele implementacji, nawet w PHP): https://github.com/twitter/snowflake/tree/scala_28

Przykładowe ID: 532260564940881920

epoch = 1325376000000 // unsigned long, any timestamp before now, in milliseconds
timestamp = unixTimestamp - epoch // unsigned long, unixTimestamp - current timestamp in milliseconds
machineld = 0 // unsigned short, 0-1023
sequence = 0 // unsigned short, 0-4095, incremented for each timestamp => ID

id = (timestamp << 22)
...... | (machineId << 12)
...... | sequence

Mały przykład dla PHP-owców(działa na 32 bitach z bc_*): http://ideone.com/n8Aa77#li_n8Aa77

- prawdopodobieństwo kolizji bliskie zeru, a przy zastosowaniu oddzielnej usługi(tak jak to się powinno robić) która generuje ID prawdopodobieństwo wynosi 0%,
- wysoka wydajność(Twitter potrzebował 10,000 ID/sekundę i nawet nie wiem czy Scala podołała),
- małe ID - 64 bity(UUID pls!),
- 2^41/1000/60/60/24/365 = ID generowane bez przerwy przez 69 lat,
- możliwość sortowania(każde kolejne ID na pewno będzie większe od poprzedniego),
- złożone tylko z cyfr(według mnie ładnie wygląda, przede wszystkim w linkach, np. jako ID postu),
- ukrywają ilość rekordów w bazie(jeżeli ktoś tego potrzebuje...).

#programowanie #cpp #scala #go #php #algorytmy
  • 10
@dupasmoka: da się sortować(tak, epoch jest zawsze niezmienne, jeżeli o to pytasz), zobacz sobie mój przykład z PHP(jest napisany na maszynę 32-bitową, więc jest dłuższy), tam jest stdout z wykonania skryptu. Zobaczysz, że każde kolejne ID jest większe.
@dupasmoka: "każde kolejne", czyli możesz sortować np. od największego ID do najmniejszego i otrzymasz rekordy według "daty" dodania. Oczywiście nie miałem na myśli, że każde kolejne ID jest większe o 1, wtedy to by był auto_increment.