kimlik .NET → Guid.NewGuid() ile üretilir Küresel benzersizlik → çakışma neredeyse imkânsız Versiyon & varyant bitleri dışında rastgele değerler En yaygın: UUID v4 (random)
yok denecek kadar az Dağıtık sistemler için ideal → Merkezi otorite gerekmez. Veritabanı & framework desteği → SQL Server, PostgreSQL, Oracle native destekler. Primary key olarak kullanılabilir.
veritabanında satır eklediğinizde (INSERT), aslında veriler sadece tabloya yazılmaz; aynı zamanda indeks yapısına da kaydedilir. Çoğu modern veritabanında bu indeks yapısı bir B+ Tree’dir.
dizilmiş değerler vardır. Integer veya artan kimlikler (auto-increment IDs) bu yapıya kusursuz şekilde oturur: yeni değer her zaman sona eklenir. Hiyerarşik bir ağaçtır: En tepede bir kök düğüm (root) vardır, altında ara düğümler, en altta ise yaprak (leaf) düğümleri bulunur. Sıralıdır: Küçük değerler solda, büyük değerler sağda yer alır. Yapraklar veriye gider: En alt seviyedeki yaprak düğümler, tablodaki satırlara (örneğin primary key değerine karşılık gelen kayıtlara) işaret eder.
da aramaları ve sıralı sorguları inanılmaz hızlı yapmamızı sağlar. Artan integer ID → Kitapları rafta sırayla yerleştirmek gibi. Düzenli, kolay. UUID → Kitapları rastgele yerlere sıkıştırmaya çalışmak gibi. Raf sürekli yeniden düzenlenmek zorunda kalır.
zamanda zamanla indeksin parçalanmasına yol açar. Bir başka deyişle, veriler diskte dağınık şekilde dağılır. Sorgular daha yavaş çalışır çünkü veriler fiziksel olarak ardışık değildir. Veritabanı bakım maliyetleri artar (reindex, vacuum gibi işlemler daha sık yapılır).
16 byte UUID’ler dağıtık sistemler için mükemmel bir araçtır ama her zaman en iyi seçim değildir. Özellikle yoğun veritabanı yazma işlemlerinde, indeks yoğun kullanılan sistemlerde ve devasa ölçeklerde performans sorunlarına yol açabilirler.
ile birlikte, UUID standardı güncellenmiş ve modern gereksinimlere cevap verecek şekilde UUIDv7 resmî olarak tanımlanmıştır. Bu doküman yalnızca UUID’nin temel yapısını (128-bit uzunluk, küresel benzersizlik, varyant ve versiyon alanları) açıklamakla kalmamış, aynı zamanda gelecekteki ölçeklenebilir sistemler için daha uygun yeni sürümler de önermiştir. RFC 9562 belgesi
de, sıralanabilirlik (ordering) özelliği tamamen kaybolmaktadır. Dolayısıyla UUIDv4 tabanlı kimlikler, veritabanlarında özellikle insert performansı ve indeks parçalanması (index fragmentation) gibi ciddi problemlere yol açabilmektedir. 4 bitlik version alanı → 0100 (v4’ü ifade eder). 2 bitlik variant alanı → UUID standardının varyantını belirtir. Kalan 122 bit → tamamen rastgele üretilir.
Veritabanı indekslerine doğal biçimde uyum sağlar, Rastgelelik sayesinde çakışma olasılığını neredeyse ortadan kaldırır. İlk 48 bit → Unix zaman damgası (milisaniye cinsinden). Sonraki 4 bit → versiyon alanı (0111 yani v7). Kalan bitler → rastgelelik (random bits).
.NET ekosisteminde kullanabileceklerdir. Böylece hem küresel benzersizlik korunmakta, hem de veritabanı performansı açısından daha uyumlu kimlikler elde edilmektedir. 2024 yılı ortası itibarıyla .NET içerisinde Guid.NewGuid() yalnızca UUIDv4 üretmektedir. Ancak .NET 9 ile birlikte UUIDv7 API’si resmî olarak eklenmiştir.
nedenle depolama açısından tamamen uyumludur. Yapısı iki ana bileşenden oluşmaktadır: Zaman bileşeni (48 bit): Unix zaman damgasını milisaniye hassasiyetinde saklar. Rastgelelik bileşeni (80 bit): Benzersizlik garantisi sağlamak amacıyla rastgele değerlerden oluşur.
(native) olarak desteklenmektedir (System.Guid). Buna karşın ULID henüz .NET Runtime içerisinde standart bir tür olarak sunulmamaktadır. Yani Guid.NewGuid() ile olduğu gibi doğrudan framework tarafından üretilmez.
32 bit 57DB → 16 bit 40F3 → 16 bit B4E7 → 16 bit 002CEF75A64A → 48 bit 04097D14, 57DB, F3, E7, 2CEF75A64A kısımları tamamen random’dur. O yüzden GUID’ler sıralanamaz (index fragmentation’ın sebebi de bu). 40F3 B4E7
Toplam 128 bit uzunluğundadır (GUID ile aynı). 26 karakterlik Crockford Base32 alfabesiyle gösterilir (0-9 ve A-Z, ama I, L, O, U yok → karışıklığı önlemek için).
01K618JS0QR9D24JK2EMRVSZN6 Toplam uzunluk: 26 karakter Base32 (Crockford) ile kodlanmış 48 bit (ilk 10 karakter) → Timestamp 80 bit (son 16 karakter) → Randomnes 01K618JS0Q R9D24JK2EMRVSZN6 Timestamp (ms) içerir. Bu bölüm tamamen rasgele üretilmiş bitlerden oluşur.