UUID v7 Generator

Menghasilkan UUID v7 berurutan waktu untuk kunci utama basis data

Format

Jumlah:

Apa itu UUID v7?

UUID v7 adalah format UUID generasi berikutnya yang distandarisasi dalam RFC 9562 (Mei 2024). UUID v7 mengkodekan timestamp Unix 48-bit dalam bit paling signifikan, diikuti oleh penanda versi dan varian, dan mengisi bit yang tersisa dengan data acak yang aman secara kriptografi.

Karena timestamp menempati bit tinggi, nilai UUID v7 diurutkan secara kronologis. Ini menjadikannya pilihan yang sangat baik untuk kunci primer database, di mana UUID acak (v4) menyebabkan fragmentasi indeks B-tree.

Mengapa UUID Acak Memfragmentasi Indeks Database

Indeks B-tree — digunakan oleh PostgreSQL, MySQL, SQLite, dan sebagian besar database lainnya — menyimpan baris diurutkan berdasarkan nilai kunci.

Dengan UUID v4 (sepenuhnya acak), setiap penyisipan baru mendarat di posisi yang pada dasarnya acak dalam pohon indeks. Ini memaksa database untuk terus membaca dan menulis ulang halaman indeks internal.

Tata Letak Bit UUID v7

UUID v7 selebar 128 bit, dibagi menjadi enam field:

BitFieldTujuan
48unix_ts_msTimestamp Unix 48-bit dalam milidetik — menempati seluruh paruh tinggi
4verNomor versi — selalu 0111 (desimal 7)
12rand_a12 bit data acak yang aman secara kriptografi
2varPenanda varian — selalu 10 (varian RFC 4122)
62rand_b62 bit data acak yang aman secara kriptografi

Presisi timestamp adalah 1 milidetik. Dalam milidetik yang sama, nilai UUID v7 diurutkan berdasarkan sufiks acak mereka.

UUID v7 vs UUID v1

UUID v1 dan UUID v7 keduanya menyematkan timestamp, tetapi berbeda secara signifikan dalam desain:

FiturUUID v7UUID v1
Epoch / Basis WaktuEpoch Unix (1 Jan 1970)Epoch Gregorian (15 Okt 1582)
Presisi Waktu1 milidetik100 nanodetik
Dapat DiurutkanYa — k-sortable berdasarkan desainTidak — field waktu tersebar dalam tata letak UUID
PrivasiTidak ada informasi host yang bocorMenyematkan alamat MAC host yang menghasilkan
Performa Indeks DBSangat baik — penyisipan berurutan, fragmentasi minimalBuruk — tidak berurutan meskipun ada timestamp
StandarRFC 9562 (2024)RFC 4122 (2005)
Dukungan Browser NativeBelum (tidak ada crypto.randomUUID v7)Tidak tersedia secara native

Untuk proyek baru yang membutuhkan UUID berurutan waktu, lebih pilih UUID v7 daripada UUID v1.

UUID v7 vs ULID

ULID (Universally Unique Lexicographically Sortable Identifier) memecahkan masalah serupa dengan UUID v7:

UUID v7
  • Mengikuti standar UUID RFC 9562 — kompatibel dengan semua alat UUID
  • Format hex bertanda hubung — dikenali secara universal
  • Dukungan kolom UUID database native
  • 128 bit total
ULID
  • Pengkodean Crockford Base32 — 26 karakter, sedikit lebih kompak
  • Tidak peka huruf besar/kecil dan menghindari karakter ambigu (I, L, O, U)
  • Lebih mudah dibaca manusia sekilas
  • Memerlukan library — tidak ada dukungan platform native

Jika Anda sudah dalam ekosistem UUID (kolom uuid PostgreSQL, REST API yang mengembalikan UUID), gunakan UUID v7. Jika memulai dari awal dan lebih suka pengkodean ramah manusia, ULID adalah alternatif yang baik.

Menggunakan UUID v7 di Database

UUID v7 belum dihasilkan secara native oleh sebagian besar database, tetapi dapat disimpan di kolom UUID standar:

PostgreSQL
PostgreSQL: simpan di kolom uuid. Ekstensi pg-uuidv7 menambahkan fungsi sisi server uuid_generate_v7().
MySQL / MariaDB
MySQL / MariaDB: simpan di kolom BINARY(16) atau CHAR(36). Buat di kode aplikasi.
SQLite
SQLite: simpan sebagai TEXT (36 karakter) atau BLOB (16 byte). Buat di kode aplikasi.

Contoh Kode

UUID v7 belum tersedia melalui crypto.randomUUID(). Gunakan library seperti uuidv7 (npm) hingga dukungan native tiba:

JavaScript (browser / Node.js 20+)
function generateUuidV7() {
  const buf = new Uint8Array(16)
  crypto.getRandomValues(buf)

  const ms = BigInt(Date.now())

  // Embed 48-bit Unix ms timestamp
  buf[0] = Number((ms >> 40n) & 0xFFn)
  buf[1] = Number((ms >> 32n) & 0xFFn)
  buf[2] = Number((ms >> 24n) & 0xFFn)
  buf[3] = Number((ms >> 16n) & 0xFFn)
  buf[4] = Number((ms >> 8n)  & 0xFFn)
  buf[5] = Number(ms & 0xFFn)

  // Set version 7 (0111xxxx)
  buf[6] = (buf[6] & 0x0F) | 0x70

  // Set variant (10xxxxxx)
  buf[8] = (buf[8] & 0x3F) | 0x80

  const hex = [...buf].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`
}

// Node.js 20+ built-in
// import { randomUUID } from 'node:crypto'  // v4 only — no v7 yet in stdlib
Python (uuid7 library)
# pip install uuid7
import uuid_extensions

uid = uuid_extensions.uuid7()
print(uid)                       # e.g. 018e2b3d-1a2b-7000-8000-abc123456789
print(uid.time)                  # Unix ms timestamp embedded in the UUID

# Or as a plain string
from uuid_extensions import uuid7str
print(uuid7str())
PostgreSQL — generate UUID v7
-- PostgreSQL 13+ extension-free implementation
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid
LANGUAGE sql
AS $$
  SELECT encode(
    set_bit(
      set_bit(
        overlay(
          uuid_send(gen_random_uuid())
          PLACING substring(int8send(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint) FROM 3)
          FROM 1 FOR 6
        ),
        52, 1
      ),
      53, 1
    ),
    'hex'
  )::uuid;
$$;

-- Usage as a default primary key
CREATE TABLE events (
  id uuid PRIMARY KEY DEFAULT uuid_generate_v7(),
  payload jsonb,
  created_at timestamptz DEFAULT now()
);
TypeScript — extract timestamp from UUID v7
function extractTimestamp(uuid: string): Date {
  const hex = uuid.replace(/-/g, '')
  const ms = parseInt(hex.slice(0, 12), 16)  // first 48 bits = ms timestamp
  return new Date(ms)
}

const uid = '018e2b3d-1a2b-7000-8000-abc123456789'
console.log(extractTimestamp(uid).toISOString())
// → "2024-03-15T10:22:05.259Z"

Pertanyaan yang Sering Diajukan

Apakah UUID v7 kompatibel mundur dengan UUID v4?
Ya. UUID v7 menggunakan format wire 128-bit, 32-digit-hex, bertanda hubung yang sama seperti semua versi UUID lainnya.
Apakah UUID v7 mengekspos timestamp pembuatan?
Ya — 48 bit pertama adalah timestamp Unix milidetik, sehingga siapa pun dengan UUID dapat menentukan perkiraan waktu pembuatannya.
Bisakah saya menggunakan UUID v7 sebagai kunci primer database tanpa kolom created_at terpisah?
Ya. Karena UUID v7 menyematkan timestamp presisi milidetik, Anda dapat mendekode nilai tersebut untuk mendapatkan perkiraan waktu pembuatan.
Berapa entropi yang dimiliki UUID v7?
UUID v7 memiliki 74 bit data acak (12 bit di rand_a + 62 bit di rand_b). Ini sedikit lebih sedikit dari 122 bit UUID v4.
Apakah UUID v7 didukung secara native di browser atau Node.js?
Belum per awal 2025. Standar RFC 9562 diterbitkan pada Mei 2024 dan dukungan platform masih mengejar. Gunakan paket npm uuidv7 untuk saat ini.