generate_ulid()#

Universally Unique Lexicographically Sortable Identifier (ULID) standardına uygun 26 karakterlik benzersiz kimlik üreten fonksiyon.


Fonksiyon İmzası#

CREATE OR REPLACE FUNCTION generate_ulid()
RETURNS TEXT

Amaç#

Zaman damgası bazlı, sıralanabilir ve benzersiz kimlik üretir. UUID’ye alternatif olarak kullanılabilir. ULID’ler hem zaman bilgisi içerir hem de lexicographic (alfabetik) olarak sıralanabilir. Supabase storage bucket larında bir fotoğrafı kaydederken kullanıldı.


Parametreler#

Bu fonksiyon parametre almaz.


Dönüş Değeri#

  • Type: TEXT
  • Length: 26 karakter
  • Format: TTTTTTTTTTRRRRRRRRRRRRRRRR
    • İlk 10 karakter: Timestamp (zaman damgası)
    • Son 16 karakter: Rastgele değer
  • Encoding: Crockford’s Base32 (0-9, A-Z, I-L-O-U hariç)
  • Example: "01HZQK7N2M9P3X5W8T6R4Q2K1S"

SQL Kodu#

CREATE OR REPLACE FUNCTION public.generate_ulid()
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
  timestamp_part TEXT;
  random_part TEXT;
  encoding TEXT := '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
  timestamp_ms BIGINT;
  temp_value BIGINT;
  i INTEGER;
BEGIN
  timestamp_ms := (EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::BIGINT;
  
  timestamp_part := '';
  temp_value := timestamp_ms;
  
  -- 10 karakter zaman kısmı (ULID standardına uygun)
  FOR i IN 1..10 LOOP
    timestamp_part := SUBSTRING(encoding FROM ((temp_value % 32) + 1)::INTEGER FOR 1) || timestamp_part;
    temp_value := temp_value / 32;
  END LOOP;
  
  random_part := '';
  
  -- 16 karakter rastgele kısım (ULID standardı)
  FOR i IN 1..16 LOOP
    random_part := random_part || SUBSTRING(encoding FROM (floor(random() * 32)::INTEGER + 1) FOR 1);
  END LOOP;
  
  RETURN timestamp_part || random_part; -- 26 karakter
END;
$function$

Kullanım Örneği#

Projede Kullanım#

Dosya: lib/common/services/file_upload_service.dart
Satır: ~25
Açıklama: Dosya yükleme servisinde benzersiz dosya isimleri oluşturmak için kullanılır.

final response = await _supabase.rpc('generate_ulid');
final ulid = response as String;

SQL Örneği#

-- ULID üret
SELECT generate_ulid();
-- Sonuç: "01HZQK7N2M9P3X5W8T6R4Q2K1S"

-- Tablo kaydı oluştururken kullan
INSERT INTO documents (id, title, content)
VALUES (generate_ulid(), 'Belge Başlığı', 'İçerik...');

-- Birden fazla ULID üret (sıralanabilir olduklarını gözlemle)
SELECT generate_ulid() FROM generate_series(1, 5);

ULID Özellikleri#

Avantajları#

  • Sıralanabilir: Timestamp içerdiği için kronolojik sıralama yapılabilir
  • Kompakt: 26 karakter (UUID: 36 karakter)
  • Büyük/küçük harf duyarsız: Tüm karakterler büyük harf
  • URL-safe: Özel karakter içermez
  • Collision-resistant: Aynı milisaniyede bile farklı değer üretir

Dezavantajları#

  • Tahmin edilebilir: Timestamp kısmı tahmin edilebilir

Format Detayları#

 01AN4Z07BY      79KA1307SR9X4MV3
|----------|    |----------------|
 Timestamp          Randomness
  48 bits            80 bits

Encoding Alfabesi:

0123456789ABCDEFGHJKMNPQRSTVWXYZ

İlgili Tablolar#

Bu fonksiyon herhangi bir tabloya özel değildir, Supabase storage bucketlarında dosya isimlendirilmesinde kullanılmıştır.


Performans#

  • Hız: Çok hızlı (~0.1ms)
  • Collision: Pratikte sıfır
  • Scalability: Dağıtık sistemlerde güvenle kullanılabilir