1 puan yazan GN⁺ 2026-03-08 | 1 yorum | WhatsApp'ta paylaş
  • Go diline UUID oluşturma ve ayrıştırma işlevlerinin standart kütüphaneye dahil edilmesi önerisi GitHub'da tartışılıyor
  • Öneri sahibi, bugün çoğu Go sunucu ve veritabanı projesinin github.com/google/uuid gibi harici paketlere bağımlı olmasını gerekçe gösteriyor
  • C#, Java, Python gibi başlıca diller zaten standart kütüphane düzeyinde UUID desteği sunuyor
  • Tartışma sürecinde UUIDv7 gibi yeni spesifikasyonlar, RFC 9562 uyumluluğu, ayrıştırma işlevlerinin kapsamı ve API tutarlılığı başlıca gündem maddeleri oldu
  • Bu öneri daha sonra crypto/rand paketine UUIDv4·UUIDv7 desteği ekleme önerisi (#76319) ile birleştirilerek ilerlemeye başladı

Önerinin özeti

  • Go standart kütüphanesine UUID oluşturma ve ayrıştırma API'si ekleme planı sunuldu
    • Hedef sürümler: UUID v3, v4, v5
    • Başlıca gerekçeler, harici paket bağımlılığı ve diğer dillerdeki standart destek örnekleri
  • UUID, RFC 4122'de (daha sonra RFC 9562) tanımlanan uluslararası bir standarttır
  • Öneri sahibi, Go'nun başlıca diller arasında UUID için standart destek sunmayan istisnai bir örnek olduğunu belirtiyor

İlk tepkiler ve tartışma

  • Bazı katılımcılar, geçmişte de benzer öneriler yapıldığını ancak reddedildiğini hatırlattı (#23789, #28324)
    • Gerekçeler arasında harici paket kullanımının yeterince kolay olması ve standart kütüphaneye kıyasla daha esnek bir sürüm döngüsü sunması vardı
  • Öneri sahibi, “Projelerin çoğu her seferinde harici paket içe aktarmak zorundaysa, bunu doğrudan standarda dahil etmek daha iyidir” görüşünü savundu
  • UUID'nin birçok dilde kriptoyla ilgili standart kütüphane içinde yer alması da destekleyici bir argüman olarak öne çıktı

Yeni UUID sürümleri ve RFC yansımaları

  • Bazı görüşler, UUID v1~v5'in artık eski kaldığını ve v7'nin yeni ve gelecek vadeden sürüm olduğunu vurguladı
    • v7 için çeşitli uygulama seçenekleri bulunduğu ve gerçek kullanım sonuçlarının izlenmesi gerektiği belirtildi
  • RFC taslağı, UUID'nin gereksiz yere ayrıştırılmamasını ve opak bir tanımlayıcı olarak ele alınmasını öneriyordu
  • Daha sonra RFC 9562 resmen yayımlanınca, ilgili tartışma UUIDv7 desteği odağına kaydı

Önerinin güncellenmesi ve birleştirilmesi

  • 2025'te RFC 9562 resmileşince, PostgreSQL 18'in UUIDv7 desteği sunduğu da gündeme geldi
  • Ardından Go tarafında, crypto/rand paketine yalnızca UUIDv4·UUIDv7 oluşturma işlevleri eklemeyi amaçlayan ayrı bir öneri (#76319) başlatıldı
    • Ayrıştırma işlevleri, RFC tavsiyeleri doğrultusunda kapsam dışında bırakıldı
  • İlk öneri (#62026), yinelenen öneri (duplicate) olarak işaretlenip kapatıldı

API tasarımı tartışmaları

  • uuid.New() varsayılan davranışının v4 mü olacağı, yoksa ileride değiştirilebilir mi olacağı tartışıldı
    • Bazıları, “Sürüm değişirse uyumluluk sorunu doğabilir” diyerek bunun her zaman v4'e sabitlenmesini önerdi
  • Compare, MustParse, Parse gibi metotların sunulup sunulmaması da konuşuldu
    • Compare için, RFC tanımı gereği sıralanabilir UUID desteği açısından gerekli olduğu görüşü öne çıktı
    • MustParse ise standart kütüphanedeki diğer Must* işlevleriyle tutarlılık için savunuldu
  • IsZero() metodunun UUID tipi için gerekli olmadığı sonucuna varıldı
  • Generator yapısının eklenmesi, sürüm bazlı tip ayrımı (UUIDv4, UUIDv7 vb.) gibi çeşitli tasarım önerileri ortaya atıldı
  • Bazıları, New() işlevinin muğlak olduğunu söyleyerek yalnızca açık sürüm işlevleri (NewV4, NewV7) sunulmasını önerdi

Başlıca teknik tartışma noktaları

  • UUID sıralaması (sorting) tanımının yalnızca v6 ve v7 için mi açık olduğu tartışıldı
  • UUIDv7 üretiminde zaman temelli sıralama garantisi ve eşzamanlılık çakışmalarını önleme (sayaç temelli yaklaşım) yöntemleri incelendi
  • Sürümler arasındaki anlamsal farklar (ör. v1'in MAC adresi içermesi, v7'nin zaman tabanlı olması) nedeniyle tek tipli tasarımın sınırlarına dikkat çekildi
  • Bazıları, sürüme göre ayrı tipler ve açık dönüşüm metotları (AsV4(), AsV7() vb.) eklenmesini önerdi

Sonuç ve mevcut durum

  • Go topluluğu, UUID için standart desteğin gerekli olduğu konusunda genel olarak hemfikir
  • Ancak standart kütüphanenin sadeliğini korumak ve RFC tavsiyelerine uymak adına
    • ayrıştırma işlevleri dışarıda bırakıldı
    • ve yalnızca UUIDv4·UUIDv7 oluşturma işlevlerinin crypto/rand'e eklenmesi yönünde bir çerçeve oluştu
  • İlk öneri (#62026), #76319 önerisine entegre edilerek ilerliyor ve
    Go dilinde UUID için standart desteğin resmileşmesine oldukça yaklaşıldığı görülüyor

1 yorum

 
GN⁺ 2026-03-08
Hacker News görüşleri
  • UUID sürüm 1~5'in zaten eski sayıldığını söylemeleri ilginçti
    Ancak v4 hâlâ en yüksek rastgeleliği sunuyor ve dağıtık veritabanlarında hotspot sorunları ile gizlilik meselelerinden kaçınmak için birincil anahtar olarak öneriliyor
    İlgili bağlantılar: CockroachDB UUID dokümanı, Google Cloud Spanner UUID rehberi

    • Ben de bunun garip olduğunu düşündüm. v7, monotonluk gerektiğinde iyi ama zaman damgası sistem bilgilerini açığa çıkarabiliyor. Bu yüzden v4 hâlâ geçerli
    • “outdated” ifadesinin uygun olmadığını düşünüyorum. Sorun gereksinim uyumsuzluğu, yaşı değil
      Her UUID sürümünün (v4 dahil) belirli durumlarda kusurları var. Nitekim birçok kuruluş, standart UUID yerine kendi tanımladıkları salt 128 bit değerleri kullanıyor
      Sonuçta UUID'nin tasarım sınırlarını aşan karmaşık gereksinimler giderek arttı
    • Varsayılan seçim v4; yalnızca özellikle sıra koruma gerektiğinde başka sürümler kullanılıyor
    • Gerçekten 128 bit rastgeleliğe ihtiyacınız varsa doğrudan 128 bit rastgele sayı kullanın. Bunu UUID formatına uydurmaya gerek yok
    • Ama v4, B-Tree eklemelerini berbat edebilir. Çekirdeğin sayfa önbellekleme verimliliği nedeniyle v7'nin çok daha hızlı olduğunu öğrendim
  • Bugün HN'de böyle ufak bir Go haberi görmek sevindiriciydi
    Son zamanlarda her yer programlamanın geleceği ya da yapay zeka konuşmalarıyla dolu; bu tür teknik konular daha taze hissettiriyor

    • Uzun zaman sonra derinlikli bir teknik tartışma görmek güzel geldi
    • Yapay zeka kaynaklı korku, belirsizlik ve şüpheden (FUD) kısa süreliğine uzaklaşmak iyi hissettirdi. Eskiden HN'yi açınca kaygılanmazdım ama son zamanlarda herkes sadece “her şey mahvolacak” diye konuşuyordu
    • Dışarıdan küçük bir teknik mesele gibi görünse de aslında Go dilinin mimarisi ve liderlik yönünü etkileyen büyük bir karar
      Mükemmeliyetçiler, uygulamacı geliştiriciler ve crypto topluluğu farklı pozisyonlar alıyor
      İlgili belge: RFC 9562
      Umarım Go doğru kararı verir. Özellikle TinyGo, mikrodenetleyiciler için gerçekten harika
    • Go'dan hoşlanmayan insanların manzarası eğlenceli. Artık kodun AI tarafından incelendiği bir çağdayız; dil eleştirisinin tadı da kalmamış gibi
  • Go'nun UUID üretimini desteklemesi umurumda değil ama standart bir UUID türünün gelmesi gerçekten önemli
    JSON, Text, database/sql gibi yerlerde tutarlı marshaling mümkün olacak
    Yakın tarihli bir Go bağımlılık analizinde google/uuid, en çok kullanılan ikinci paket çıkmıştı
    İlgili analiz: The most popular Go dependency

    • Ben de dec128 türünün standart olarak gelmesini isterim. uint128'e kolay dönüştürülebilen bir struct biçiminde sunulursa ideal olur
  • Go'nun çekiciliği gösterişli özelliklerden çok pratikliğinde yatıyor
    Dil, çökecek kadar karmaşıklaşmadan yalnızca gerekli özellikleri ekliyor

    • Ben de yakın zamanda birkaç sürümü birden atlayarak yükselttim ve hiçbir sorun yaşamadım
      Uyumluluk garantisi sayesinde güvenle kullanılabiliyor. Değişim yavaş ama dil istikrarlı biçimde daha iyiye gidiyor
  • Google'ın uuid paketinin pasif kalmasından çok, gofrs/uuid'nin yeni standardı takip etmesi ve aktif biçimde bakım görmesi daha önemli bence
    gofrs/uuid deposu

    • Dış bağımlılığı olmayan kütüphaneler yapmak keyifli. Bu değişiklikle böyle işler daha da kolaylaşacak
    • Ama google/uuid için 2024'ten sonra bir sürüm çıkmadı ve 2025 Haziran'ında da ilgili bir issue hâlâ açık
      Issue #194
    • Bu teklif zaten 3 yıldır tartışılıyordu
  • UUID'den gerçekten nefret ediyorum. İnsan dostu olmayan bir tanımlayıcı
    Hata ayıklamada ya da sorgu sonuçlarında fazla uzun ve kullanışsız.
    Elbette tamamen ayrık sistemler arasında benzersiz ID gerektiğinde işe yarıyor ama çoğu yerde aşırı kullanılıyor
    Genel durumda merkezi bir numara üreticisi çok daha iyi.
    Örneğin veritabanındaki GetNextId gibi bir prosedür daha insani ve daha verimli

    • Eskiden şirkette projeleri 6 haneli kodlarla yönetirdik ama biri çıkıp bunu UUID ile değiştirdi
      Sonuçta insanın okuyamadığı kodlar ortaya çıktı; üstelik kendi implementasyonlarıydı ve garip biçimde sıralıydı. Tam bir felaketti
    • Aslında çoğu durumda tam sayı sayacı yeterli
      Postgres'te sayaç tablosu kullanarak saniyede on binlerce ID üretilebiliyor
      Bu da bellek tasarrufu, sıkıştırma verimi ve hash map performansı sağlıyor
      UUID kullanışlı ama performansı mahvediyor
    • Keşke insanın okuyabileceği bir unsur eklense
      Örneğin BASKETBALL-...-FISH gibi, kelime tabanlı bir checksum eklenirse akılda tutmak kolay olur
    • “Deterministik rastgeleleştirme”den söz edilmişti; ben de LFSR (linear feedback shift register) gibi bir yaklaşımın makul olduğunu düşünüyorum
  • Go'ya UUID'nin gerçekten eklenip eklenmeyeceğini merak etmiştim

    • Şu anda ‘Likely accept’ durumunda. Go proje panosunda görülebilir
      Özel bir itiraz çıkmazsa dahil edilme olasılığı yüksek
    • Evet, eklenmesi planlanıyor
  • Kotlin de yakın zamanda 2.3 sürümünde RFC 9562 tabanlı UUID sürüm desteğini standart kütüphaneye ekledi
    JVM, JS, WASM ve Native'ın tamamını destekliyor.
    IETF RFC istikrara kavuştuğuna göre Go'nun da bunu takip etmesi mantıklı

  • Go'nun böyle temel işlev desteği eksikleri biraz üzücü

    • Bunu daha iyi standartlaştıran hangi diller var merak ediyorum. Java olabilir mi? Python ve Rust'ta da durum benzer
    • “Batteries included” anlayışının anlamı 20 yılda çok değişti. Belki de Google içinde ihtiyaç duyulmayan bir özellikti
    • UUID sonuçta sadece 16 baytlık bir dizi. v4 üretimi birkaç satırda halledilir. Çok büyük bir mesele değil
    • Tam olarak hangi işlevin eksik geldiğini merak ediyorum
      Benim açımdan Go'nun loglama sistemi fazla basit olduğu için kendim kurmak zorunda kaldım
      slog modülü yavaş ve kullanışsız. Sanki sadece kurumsal ortam düşünülmüş gibi
    • Yine de Go'nun standart kütüphane kalitesi üst düzey. Günlük geliştirmede en çok kullandığım stdlib bu olabilir
  • v7'nin DB kümeleme verimliliğini ve v4'ün rastgeleliğini aynı anda elde etmenin bir yolu olur mu diye düşündüm
    İçeride v7 kullanıp dışarı gönderirken XOR ya da AES ile karıştırmak mümkün olabilir

    • Gerçekten de böyle bir deneme var: uuidv47 projesi
    • Ama amaç gizlilikse, bence doğrudan tam sayı anahtarlarını şifrelemek daha iyi
      Örneğin Feistel şifrelemesi kullanarak UUID'nin performans sorunları olmadan opak genel ID'ler üretilebilir