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 TEXTAmaç#
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 bitsEncoding 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