Danyloff

ULID πŸ‘ Ρ‚ΠΎΡ‚ самый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ


  • Β·

Β· Β·

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я описал Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΠ°ΠΊ ΠΎΠ½ выглядит ΠΈ написал Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° PHP. И Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ достаточно, Π΄Π° ΠΈ ΠΊΠΎΠ΄ Π΅ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°?! НС Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ НЕВ! Код ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²ΠΏΠΎΠ»Π½Π΅ бСзопасно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π±ΠΎΠ΅Π²ΠΎΠΌ сСрвСрС. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ½ придСтся Π’Π°ΠΌ ΠΏΠΎ вкусу.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ Π’Π°ΡˆΠ΅ΠΌΡƒ вниманию ULID πŸŽ‰

ULID – это Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Universally Unique Lexicographically Sortable Identifier(Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ лСксикографичСски сортируСмый ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€). Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π΅Π³ΠΎ отличия ΠΈ Ρ‡Π΅ΠΌ ULID Π»ΡƒΡ‡ΡˆΠ΅ UUID, спСцификация это описываСт:

  • UUID Π½Π΅ самый эффСктивный способ кодирования 128 Π±ΠΈΡ‚ случайных Π΄Π°Π½Π½Ρ‹Ρ….
  • UUID v1/v2 Π½Π΅ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… срСдах, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ доступа ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ, ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ MAC-адрСсу.
  • UUID v3/v5 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ исходного значСния ΠΈ создаСт случайно распрСдСлСнныС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… структурах Π΄Π°Π½Π½Ρ‹Ρ….
  • UUID v4 Π½Π΅ прСдоставляСт Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ случайных Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… структурах Π΄Π°Π½Π½Ρ‹Ρ….

А Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ULID, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠ· спСцификации

  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с 128-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ UUID.
  • 1,21e+24 ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ULID Π² миллисСкунду.
  • ЛСксикографичСски сортируСмый!
  • ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ прСдставлСниС Π² Π²ΠΈΠ΄Π΅ строки ΠΈΠ· 26 символов, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ 36 символов Π² UUID.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Base32 Douglas Crockford для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ эффСктивности ΠΈ читаСмости (5 Π±ΠΈΡ‚ΠΎΠ² Π½Π° символ).
  • ΠΠ΅Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊ рСгистру.
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов (Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ URL).
  • ΠœΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½Ρ‹ΠΉ порядок сортировки (ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ опрСдСляСт ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ миллисСкунду).

БпСцификация πŸŽ“

Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π΄Π°Π½Π½ΡƒΡŽ строку 01HBNDH8EZNE6Y66H3XHZBBEH9, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ 1696157180383. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π΅ΡΡΡ‚ΡŒ символов это число Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Base32

01HBNDH8EZ
48bits

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ символы это случайный Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ² Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Base32

NE6Y66H3XHZBBEH9
80bits

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

Π‘Ρ‚Ρ€ΠΎΠΊΠ° состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Timestamp
  • 48-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число
  • UNIX-врСмя Π² миллисСкундах
  • ΠœΠ΅ΡΡ‚ΠΎ Π½Π΅ закончится Π΄ΠΎ 10889 Π³ΠΎΠ΄Π° нашСй эры
Randomness
  • 80 Π±ΠΈΡ‚
  • ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ источник случайности, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π²Ρ‹ΠΉ символ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отсортирован ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π° самый ΠΏΡ€Π°Π²Ρ‹ΠΉ символ – послСдним (Π² лСксикографичСском порядкС). Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартный Π½Π°Π±ΠΎΡ€ символов ASCII. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ сортировки Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ миллисСкунды Π½Π΅ гарантируСтся.

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Base32 Douglas Crockford ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ. Π’ этом Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π±ΡƒΠΊΠ²Ρ‹ I, L, O ΠΈ U, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΈ злоупотрСблСния.

ΠœΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ULID Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ миллисСкунды, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ порядка сортировки. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Ссли обнаруТиваСтся ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ миллисСкунда, случайный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ увСличиваСтся Π½Π° 1 Π±ΠΈΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ наимСньшСго Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ разряда (с пСрСносом).

Если, Π² ΠΊΡ€Π°ΠΉΠ½Π΅ маловСроятном случаС, Ρƒ вас удастся ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 280 ULID Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ миллисСкунды ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ случайного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с мСньшим числом ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚ΠΎ гСнСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ.

Ошибки пСрСполнСния ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ строк Base32

ВСхничСски, строка, закодированная Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Base32 с использованиСм 26 символов, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ 130 Π±ΠΈΡ‚ΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ULID Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всСго лишь 128 Π±ΠΈΡ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ самый большой допустимый ULID, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Base32, составляСт 7ZZZZZZZZZZZZZZZZZZZZZZZZZ, Ρ‡Ρ‚ΠΎ соотвСтствуСт эпохС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 281474976710655 ΠΈΠ»ΠΈ 2 ^ 48 – 1.

Π›ΡŽΠ±Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ULID, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΉ этот Ρ€Π°Π·ΠΌΠ΅Ρ€, Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Π° всСми рСализациями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ошибки пСрСполнСния.


Π’Π°ΠΊ ΠΆΠ΅ интСрСсно

БпСцификация JSEND

ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ словами, JSend - это спСцификация, которая опрСдСляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° форматирования JSON-ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΎΡ‚ Π²Π΅Π±-сСрвСров. JSend сосрСдоточСна Π½Π° сообщСниях...

LRO ⏰ ΠΈΠ»ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ API

Π‘Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ситуации ΠΊΠΎΠ³Π΄Π° выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя ΠΈ/ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ большоС количСство Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов. И трСбуСтся...