UUID - GUID Nedir? Avantajları ve Dezavantajları Nelerdir?

1-  Giriş

Bu yazıda, UUID tanımından, avantajlarından, dezavantajlarından bahsedeceğiz.

2- UUID Nedir

UUID (A universally unique identifier (UUID) yaklaşık Türkçe karşılığı,  Evrensel Olarak Benzersiz Tanımlayıcı anlamına gelir. GUID (Globally Unique Identifier) ise UUID ile aynı şey olup isimlendirilmesi microsoft teknolojilerinden kaynaklı gelmektedir.

3- UUID Formatı

UUID temelde 128 bit (16 byte) ve  32 hexadecimal (on altılı sayı sistemi) karakterden oluşan, genellikle dört tire "-" ile ayrılmış , 8-4-4-4-12 formatında, 5 gruplu, toplamda 36 karakterden oluşan karakter dizisidir.

UUID örnekleri;
4a81519d-805e-4fbe-b6ee-23ee6a56192e
882f2a2d-835f-48e9-8c15-0f9c924c8a5d
cc1f4935-efbe-4d5e-8531-cd113955140b

Not: UUID versiyon ve varyant değerleri farklı olsa da tüm UUID formatı aynıdır.

4- Neden UUID tercih edilebilir? Avantajları nelerdir?

4.1 Tahmin Edilmesinin Zor Olması

  • UUID, sıralı artışlı tam sayı tipinde (Sequential Increment Integer) bir id değerine göre daha güvenlidir. Bunun sebebi sıralı artışlı değerlerin tahmin edilmesi daha kolaydır.
  • Örnek olarak; veritabanındaki verilerimizin ID değerlerinin tam sayı tipinde (integer) olduklarını varsayalım.
    Servislere erişimi olan birinin, "5" id değerli user'i veya "5323" id değerli postu alması pek zor olmaz. Hatta döngü kullanarak sıralı bir şekilde (5,6,7...) aldığını da düşünürsek tüm verilere erişebilir.
  • ID değeri UUID değerli olursa, iki UUID değer arasında sıralı bir artış değeri olmayacaktır. Bundan dolayı tahmin edilmesi çok ama çok daha zor olacak ve veriye erişim konusunda güvenliği arttırmış oluruz.
  • "/api/user/{id}" servisimiz olsun ve ilgili servisten belirtilen id değerine bağlı kullanıcıyı getirsin;
    - "/api/user/5353" isteğinde, "5353" tam sayı tipindeki id değerli veriyi tahmin edip servisten getirmek kolaydır.
    - "/api/user/e92daafd-4158-4c29-b284-b2863641941d"  isteğinde "e92daafd-4158-4c29-b284-b2863641941d" UUID değerini tahmin edip servisten getirmek çok daha zordur.

4.2 UUID değerlerinin eşsiz olması ve Veri Birleştirmeleri;

  • UUID değeri, tamsayı tipteki id değerlerine göre tüm veritabanları ve tablolar arasında eşsiz değerdedir. Böylece veritabanları veya tablolar arasında birleştirmeler yapıldığında ID değerleri arasında çakışma olmayacaktır. Sonuç olarak birleştirme veya veri ekleme işlemleri çok daha kolay olacaktır.
  • Örneğin: İki veritabanı arasında kullanıcıları ve buna bağlı ilişkisel tablodaki verileri birleştireceğimizi varsayalım.
    - Bu iki veritabanında id değerleri tamsayı olarak tutulduysa birleştirme sırasında bu verilere yeni id değerleri atanmak zorunda kalacağız.
    - Buna bağlı ilişkisel tablolara da bunlar yansıtılacağı için bu işlem daha fazla efor gerektirecektir.
    - Sadece kullanıcılar değil tüm veritabanı birleştirmelerini düşündüğümüz zaman belki onlarca, yüzlerce tablo olacağı için bu işlem daha da zaman alacaktır.

4.3 Dağıtık (Distributed) Sistemlerde;

  • Özellikle kısa süreler içersinde çok fazla ID üretimine gereksinim duyulan dağıtık sistemlerde eşsiz ID değeri üretimi zorluk oluşturur.
    - Örneğin: Aynı ihtiyaç doğrultusunda aynı veya farklı onlarca, yüzlerce çalışan uygulama örneklerinin (instances), T anında çok sayıda ID üretme ihtiyacı olabilir. Üretilen tüm ID'ler eşsiz olmak zorundadır fakat iyi bir strateji izlenmezse ID çatışması (collision) veya sisteme bağlı olarak darboğaz (bottleneck) gibi problemler yaşanabilir.
  • UUID değeri bağımsız olarak üretilebildiği için bu ihtiyacı kolaylıkla çözebilir.
    - Her çalışan instance diğer instanceden bağımsız olarak ID (UUID) değerini üretebilir. Yani, T anında çok sayıda makinadan üretilen UUID değerinin ID çarpışmasına uğraması bir hayli zordur. (Yazının devamında ihtimallerinden bahsedilecektir)

4.4 Diğer Avantajları:

  • Uygulamadan veya platform bağımsız olarak UUID üretilebilir.
  • Özellikle ilişkisel veri tablolarına veri ekleme (insert) işlemi çok daha kolaydır.

5- UUID Kullanımı Dezeavantajları

5.1 Depolama (Storage)

  • Tamsayı değerli ID değerine göre çok daha fazla belleğe ihtiyaç duyar.
  • Integer tipli bir id değeri 4 bytes, big-int tipli id değeri 8 bytes yer kaplarken, UUID değeri 16 bytes yer kaplamaktadır.

5.2 Hız (Speed)

  • UUID'lerin oluşturulması, tam sayı türündeki ID oluşturmaya kıyasla genelllikle daha yavaştır.
    - Çünkü UUID'leri oluşturmak daha karmaşık yapıdadır ve daha fazla zamana ihtiyaç duyar. Bu sebeple, bu karmaşıklık, UUID oluşturma sırasında tam sayı tipi ID değerine göre hafif bir performans kaybı yaşatır.
  • Tamsayı (Integer) ID değerlerin taranması ve indekslenmesi UUID String'e göre daha hızlıdır.
  • Buna bağlı olarak da, indexlenmedeki bellek artışı da fazladır.

5.3 Diğer dezavantajları:

  • Sorgularda ve Debugging'de kısmen zorluk yaratır.
  • İnsan tarafından okunmasında zorluk yaratması ve sıralı olmayışları
  • URL'de uzun görülmeleri.

6- Gerçekten eşsiz (Unique) mi?

  • UUID ( GUID) tanımlaması içinde Unique ifadesi yer alsa da, matematiksel olarak algoritma ile değerin üretilmesinde bu değer çiftleyebilir/tekrar edebilir (duplicate) fakat bu göz ardı edilecek kadar küçük bir olasılıktır.
Çiftleme ihtimali; Versiyon 4 için ele alacak olursak,%50 olasılıkla en az bir çarpışma olması için üretilmesi gereken rastgele versiyon 4 UUID'lerin sayısı 2,71 kentilyondur.
Bu sayı, yaklaşık 85 yıl boyunca saniyede 1 milyar UUID üretmeye ve UUID başına 16 bayt ile toplamda 45 exabyte depolama değerine eşittir.  Bu nedenle, Versiyon 4 UUID ile üretilmiş olan 103 trilyon UUID'de bir duplicate (çiftleme) değer bulma olasılığı milyarda birdir.

Sonuç

Bu yazıda, UUID tanımından, avantajlarından, dezavantajlarından bahsetmiş olduk.

Daha fazla

UUID Versiyonları ve Varyantları ->

UUID Versiyonları ve Varyantları
1-Giriş Bir önceki yazımızda UUID hakkında daha temel bilgiler vermiştik. Avantajlarından ve dezavantajlarından bahsetmiştik. Bu yazıda UUID versiyon ve varyant değerlerine değineceğiz ve bazı versiyonlar için UUID değerleri üreteceğiz. 2- UUID Formatı 32 hexadecimal karakterden oluşan, 4 tire i…

Yararlandığım kaynaklar;

https://en.wikipedia.org/wiki/Universally_unique_identifier
https://datatracker.ietf.org/doc/html/rfc4122
https://stackoverflow.com/questions/45399/advantages-and-disadvantages-of-guid-uuid-database-keys