Basit bir tamsayı yerine uzun, dize kimliğini ne zaman kullanırsınız? [kapalı]


54

Youtube'u örnek olarak kullanmak isterdim: kimliklerini biçiminde kullanırlar PEckzwggd78.

Neden basit tamsayılar kullanmıyorlar?

Veya imgur.com - ayrıca 9b6tMZSresimler ve galeriler gibi kimlikleri kullanırlar . Sıralı tamsayılar değil.

  • Neden tamsayılar kullanmıyorlar (özellikle sıralılar)?

  • Hangi durumlarda tamsayılar yerine bu tür kimlikleri kullanmak akıllıca bir karardır?


47
Kimliklerin sadece basit tamsayılar olmadığına inanmanızı sağlayan şey nedir? DB'deki tamsayıları kullanan ancak bazı base64 kodlamalarında görüntüleyen URL'lerin daha güzel görünmesini sağlayan çok sayıda web hizmeti biliyorum. İlginçtir ki, youtube kimlikleri neredeyse 64bit tam sayılara eşlenir.
Josef

2
@wwong Ancak OP'ler sorusu neden sayısal kimlikleri kullanmıyorlar ve cevap şu olabilir: Sayısal kimlikleri kullanıyorlar, sadece bunları base10 veya base2 yerine base64'te görüntülüyorlar. Kesin olarak bilmiyorum, bu yüzden OP'ye soruyorum ki, özellikle ID'lerin base64'te basit 64bit tamsayı olmadıklarını düşünmelerini sağlayan şeydir.
Josef


3
Olarak aynı değil midir bu .
the_lotus

Yanıtlar:


101

Youtube sıralı ID'leri iki nedenden dolayı kullanamaz:

  1. Veritabanları neredeyse kesinlikle dağıtılmış ve sıralı numaralandırmayı karmaşık hale getirmiştir.

  2. Bir gizlilik seçeneği "Listelenmemiş videolar" var: arama sonuçlarında görünmeyen, ancak kimliğinizi biliyorsanız kullanılabilir.

Bu nedenle, video kimlikleri makul olarak rastgele ve öngörülememelidir. Kimlik bilgisinin sadece rakamlarla mı yoksa harf ve rakamların bir kombinasyonu ile mi temsil edildiği önemli değildir: Bir temsilden diğerine önemsiz bir haritalama vardır.


11
Sayısal idlar sıralı olmak zorunda değil
Sopel

28
@Sopel IMil'in amacının Youtube'un seyrek olan kimlikler üretmesi gerektiği olduğunu düşünüyorum. Başka bir deyişle, yalnızca 2^40eşyaları saklamanız gerektiği tahmin ediliyorsa, bazı mimarilerde bir alan 2^80veya 2^120bit seçimi için meşru sebepler vardır . Sebeplerin örnekleri: çarpışmayı teknik olarak kontrol etmeden çarpışmayı azaltmak; Anahtarların seyrekliğini bulmak ("listelenmemiş video") gibi sırları zorlaştırmanın bir parçası olarak kullanma
17'de

13
@Sopel sorusu "Neden tamsayılar kullanmıyorlar (özellikle sıralı olanlar)?" Şunu açıkladım: 1) sıralı kimlikler istenmeyen; 2) tamsayılar ve dizgiler temelde aynı şeydir
IMIL

3
"Bu nedenle" cümlesi mantıklı bir şekilde uymuyor, ancak iki numaralı nokta doğru. Neden rastgeleliğin gerekli bir sonuç olmadığının bir örneği olarak: tek tip aralıklarla sıralı numaralandırma, sonuçların bir veri depounda birleştirilebileceği şekilde birden fazla bağımsız veritabanında benzersiz kimlikler sağlamak için çalışacaktır - bu, bir paylaşım şeklidir. Yani, 10000'den fazla bölgesel veritabanını beklemiyorsanız varsayalım (belki de şu anda sadece 10'unuz var, yani 10000 yeterlidir). Daha sonra her db, benzersiz son 4 hane ile 10000 sayılan bir kimlik sütununa sahip olabilir, birleştirme konusunda çarpışma olmaz.
davidbak

2
@davidbak rastgelelik koşulu (2) 'den takip eder. Benzersizlik, örtüşmeyen aralıkların farklı veritabanı örneklerine atanmasıyla elde edilebilir, ancak bu ID'lerin öngörülebilir olmasını sağlar.
IMil

75
  • Kimliklerinin formunda: Onlar Base64 kullanıyorsanız (karakterleri kullanarak a- z, A- Z, 0- 9, -ve _). Bu, karakter başına 6 bit bilgi edinmelerini sağlar. YouTube 11 karakterlik video kimliği kullanır; bu da 2 6 * 11 veya daha fazla 7 * 10 19 kimlik üretebilecekleri anlamına gelir . As Tom Scott koydu , o "etrafında 18.000 yıldır videoyu her dakika upload Dünya gezegeninde her insan için yeterli." Var Base64 ile çalışmak da kolaydır, çünkü 64, 2 değerinde bir güçtür, yani her karakter kesin bir bit sayısını temsil eder. Aynı nedenle onaltılık (taban 16) kullanıyoruz.

  • Kimliklerin sıralı olmadığına göre: Bu, videolara kimlik atayan tüm sunucular arasında senkronize bir sayaca ihtiyaç duymadıkları anlamına gelir. Sadece rastgele bir sayı oluşturabilir, kullanımda olup olmadığını kontrol edebilir ve oradan gidebilirler. Hatta her sunucuya, çoğaltma denetiminden seçim yapmaları ve engellemeleri için bir kimlik bloğu atadılar. Bunu yapıyorlar mı bilmiyorum ama yapabilirler.

  • Sıralı olmayan ID'lerin bir başka nedeni de "listelenmemiş" videoları çalıştıran şey olmasıdır. Bunlar, arama sonuçlarında veya önerilerde gösterilmeyen, ancak bağlantıya sahipseniz erişilebilen videolardır. Sıralı sayma kullanıyorsanız, sadece bir videoya gidebilir, kimliği bir artırabilir ve listelenmemiş videoların fikri artık bozuldu.

  • Sıralı olmayan kimlikleri ayrıca toplam video sayısı veya süre başına yüklenen video sayısı gibi rakiplerden gelen bilgileri gizlemeye yardımcı olur.

Tom Scott'un videosunu şiddetle tavsiye ederim . Onun bilgisi neredeyse her zaman hem ilginç hem de doğru.


6
Ayrıca bir base64 kodlamanın 11 karakterinin 66 bit bilgi depoladığını ve bunun 64bit bir tamsayıyı bu tür bir dizeye kolayca eşleştirebilecekleri anlamına geldiğini de belirtelim. Yani dahili olarak, 64bit int kullanabiliyorlardı (ama buna gerek yok).
Bernhard Hiller

1
Karşılaştırma için, geleneksel ondalık gösterimi, Base64 ile karşılaştırıldığında 9 karaktere kadar "boşa harcayan" kadar 20 karakter gerektirebilir.
dan04

Tom Scott videosu bunu mükemmel bir şekilde açıklıyor.
AGB

13
  • Tamsayılar, o kadar iyi ölçeklendirmezler, "normal" bir 32-bit işaretsiz tamsayı sadece 4 milyardan fazla çıkacaktır.

  • Çevrimiçi olarak kaç öğenin bulunduğunu bilmenizi ya da büyüdükleri oranı takip etmenizi istemeyebilirler.

  • Harfler rakamlardan daha fazla bilgi tutabilir, aynı "sayıyı" ifade etmek için daha az harfe ihtiyacınız vardır. Büyük bir dizin oluşturucu veritabanı için bu ekleyebilir.


7
1) int 64
Rakori'yi

4
2) neden? ........... hepsi zaten halka açık. halka açık olmayanlar - erişilemez. işte bu
Rakori

3
3) detaylandırabilir misiniz? hangi bilgileri ifade eder?
Rakori

2
1 için: aynı int32 ve int64 için de geçerli. İnt64 potansiyel olarak daha büyük olsa da, yeterince büyük olamazdı.
Nepho,

3
Veritabanında, bir sayıyı sayı olarak saklarsınız. Yani bir 32 bit int 32 bit alacaktır. Metin daha az yoğunluğa sahip olacaktır (ne kadar zayıf metin kodlamaya bağlı olacaktır)
Taemyr

8

1) Bazı web siteleri neden kimliklerinde harf kullanıyor? Onlar ip mi?

Bu web sitelerinin kimliklerini veritabanlarında dizge olarak depolayıp saklamadıklarını bilmiyoruz. Sayılar ve dizgiler bilgisayarlarla gerçekten aynıdır. Bir dize sadece farklı bir tabanla gösterilen bir sayıdır. 'A' = 0x41 = 65 = 0b1000001, bilgisayara hepsi aynı. Ancak eğer görüntülerseniz, taban ne kadar büyükse, temsil o kadar kısa olur ve URL’lerin o kadar kısa sürede okunması ve insanlar için paylaşılması daha kolaydır. YouTube ve Imgur gibi siteler, büyük sayılar için nispeten kısa olan, taban 62'yi (harfler, büyük ve küçük harf, artı rakamlar) veya daha büyük (kısa çizgi veya başka bir geçerli URL karakteri ekleyin) kullanır. Ne kullanmayı tercih edersiniz, youtu.be/23489234892348234933veya youtu.be/B9k6KMrv8vh?

2) Neden sıralı olmayan ID'ler kullanılıyor?

IMil'in cevabı bunu iyi açıklıyor:

Youtube sıralı ID'leri iki nedenden dolayı kullanamaz:

  • Veritabanları neredeyse kesinlikle dağıtılmış ve sıralı numaralandırmayı karmaşık hale getirmiştir.

  • Bir gizlilik seçeneği "Listelenmemiş videolar" var: arama sonuçlarında görünmeyen, ancak kimliğinizi biliyorsanız kullanılabilir.

Bunlar aynı zamanda kimliklerin neden bu kadar büyük olduğunu da açıklıyor: (YouTube açıkça 23,489,234,892,348,234,933 farklı videoya ev sahipliği yapmıyor)

  • Kimlik oluştururken, yanlışlıkla aynı kimliği iki kez oluşturursanız sorun olur; bu nedenle doğum sorununu önlemek için büyük bir kimlik alanına ihtiyacınız vardır.

  • Bir video için kullanılan herhangi bir geçerli kimlik kimliği çok küçük değilse, kullanıcılar listelenmemiş videoların URL’sini tahmin edebilirler.


3
> "YouTube 23,489,234,892,348,234,933 farklı videoya ev sahipliği yapmıyor, açıkçası" Bunun net olup olmadığından emin değilim;)
unperson325680

People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.- Listelenmemiş bir videonun, yazarı dışındaki herkes için erişilebilir olup olmadığını nasıl anlarsınız? başkası kimliğini tahmin
etmiş


2
@ progo Yani, dünyadaki her bir insan ortalama olarak YouTube’a ortalama 3.3 milyar video yükledi mi…;)
Jasmijn

5

neden sadece tamsayılar değil, özellikle sıralı olanlar? Ve ne zaman, hangi durumlarda tamsayılar yerine bu string ID'ye akıllıca bir karar veriliyor?

  • Daha iyi UTF-8 alanı - bir sayıyı bir dizgeye çevirdiğinizde karakter başına en fazla 10 kombinasyon elde edersiniz (0-9), ancak herhangi bir alfa sayısal karakterine izin verdiğinizde karakter başına 62 kombinasyon elde edersiniz (az, AZ, 0-9 bu nedenle, alfasayısal dizeleri kullanarak, sayısal dizeleri kullandığınızdan daha kısa URL'ler üretebilirsiniz. Bu, kullanıcıların URL'leri paylaştığı siteler için önemlidir - Youtube ve Imgur gibi.
  • Sıralı tamsayıların üretilmesi daha zordur. Sıralı artan bir tamsayı üretmek için sayıları tek bir iş parçacığına sahip olmanız veya dağıtılmış bir sistemdeki birçok ana bilgisayarı koordine etmeniz ve Youtube veya Imgur gibi rastgele oluşturulmuş bir dize kadar güzel ölçeklenmeyen yüksek hacimli bir uygulama çalıştırdığınızda (o demek değildir olan rasgele üreten)

Bir kenara, iç temsil bu her zaman böyle değil ise bir dize. Büyük olasılıkla kısa url için sayısal bir tanımlayıcıyı alfanümerik bir dize olarak kodlayabilirler.


1
2) bir string ID olması durumunda, ancak bir db'ye yeni bir kayıt eklemeden önce zaten bir string ID oluşturulduğunu doğrulamanız gerekir. int kimliğiyle ne fark eder o zaman?
Rakori

@Rakorin UUIDv4 kadar basit bir şey kullanırken bile, çarpışma ihtimali miniktir. Yeterince rastgelelik kullanın ve şans oldukça varolmaz, bu nedenle kopyalamanın gerçekten doğrulanması gerekmez.
Andy

1
@davidpacker ve bunun daha uzun bir tamsayı üretmekten farkı nedir?
Sopel

@Sopel Samuel'in işaret ettiği gibi, tamsayılar karakter dizisinden daha fazla yer kaplar, yani daha uzun olur. Aksi takdirde, gerçekten bir fark yoktur.
Andy

1
@davidpacker yalnızca yazdırıldığında
Sopel

2

Eğer işaret ettiğiniz gibi çünkü kaput şeyin altında sadece numaralarını kullanarak evrensel benzersiz bir kimlik kullanımı kolay olacağını adildir 0ve 1ve daha fazla hassasiyet 128 bit veya daha fazla gidiyor sayısını artırmak olabilir.

Bence asıl sebep, bazı sabit sabit aralıkları varsayarsak uint32(sadece bir örnek için), eğer harfleri kullanırsanız, toplamda daha kısa bir kimliğe sahip olabilirsiniz.

URL'nin estetik bir nedeni olduğunu hayal ediyorum. 4,129,873,773Harflerle birlikte olmak yerine, çok daha kısa Fu837t(benim tarafımdan yapılmış sadece kurgusal). Bir kullanıcı, bir arkadaşına verdiğiniz URL'yi bile hatırlayabilir. Youtube gibi platformlar genellikle 32 bit'den daha uzun UUID'lere sahiptir, çünkü hızlı bir şekilde yerlerinin tükenmesine neden olurlar.


3
Bu bence cevap budur. Dizeleri kullanmak, benzersizliği korumak için ne daha verimli ne de daha kolaydır. Sebep, bir url olarak temsil
etmenin

Bir kullanıcı Fu837t’i hatırlayabiliyorsa, ancak 2390’ı hatırlayamıyor mu?
Rakori

4
@ Rakori: Fu837t, 2223955238 ile karşılaştırır, yani evet. 2390 "Vg" olarak kodlanacaktı, yani: evet.
Mooing Duck

@ MoooDuck, hayır. Bu dize kimliğini oluşturmak için kullanılan algoritmanın ne olduğunu nereden biliyorsunuz?
Rakori

3
@Rorori bir algoritma değildir, bir kodlamadır. Farklı kodlamalar arasında sayıları aktarmak için algoritmalar vardır, ancak hangisinin kullanıldığı kodlamanın iyi tanımlandığı sürece önemli değildir. URL güvenli base64 kodlaması iyi bilinmektedir ve standartlaştırılmıştır .
Josef

2

Bağlama ve paylaşmayı daha basit hale getirdiğinden kısa bir URL istenir (örneğin, bir SMS bağlantısını paylaşabilirsiniz, yazmak daha hızlıdır). Youtube veya Imgurl gibi hizmetler URL'leri rasgele paylaşmanızı istiyor, bu yüzden bu önemli bir husustur.

Sayısal olmak yerine alfanümerik kimlikleri kullanmak, aynı bit büyüklüğünde bir kimliği ifade etmek için daha az karaktere ihtiyacınız vardır. Örneğin 6 hane size bir milyon benzersiz kimlik verir fakat 6 alfanümerik karakter (base64 setini kullanarak) size 68 milyar benzersiz tanımlayıcı verir .

Bildiğimiz kadarıyla, alfanümerik tanımlayıcılar sadece base64 gibi alfanümerik bir formatta kodlanan sıralı sayılar olabilir. Ancak çoğu zaman ticari hizmetler, kişilerin kimlikleri tahmin etmelerini önlemek ve müşterilerin miktarı gibi ticari bilgileri açıklamaktan kaçınmak için sıralı kodlardan kaçınır.


1

Sayısal olmayan kimlikleri kullanmanızın çeşitli nedenleri var, ancak alfabetik karakterli tüm değerlerin gerçekte dizge olmadığını da anlayın. YouTube, her dakika yüklenen 300 saatlik videonun sırasına göre inanılmaz sayıda videonun ününe sahiptir ( ref ). Bu videoları temsil eden benzersiz tamsayılar oldukça uzayabilir, bu nedenle Base64 URL kodlu sayılar ( ref ) gibi bir şey kullanın .

Tanımlayıcı Temsil Türleri:

  • Basit tam sayılar: (12345, 981027489382493)
  • Temel 16 tamsayılar: 123456789abcdef - Hex olarak da bilinir
  • Temel 64 tamsayılar: 9b6tMZS
  • Okunabilir dizgiler: 12032017-Okuma-benim-harika-makale-01

Hepsinin güçlü ve zayıf yönleri var. Tanımlayıcılarınız için kullanabileceğiniz daha benzersiz karakterler, bir sayıyı temsil etmek için ihtiyaç duyduğunuz kadar az karakter kullanır. Temel 64 sayıları oldukça iyi bir uzlaşmadır, çünkü URL'ler için çalışan ve 6 ile 8 arasında bir sayıyı temsil etmek için gereken karakter sayısını sıkıştıran (yani 3/4 boyutunda) yerleşik bir değişken vardır.

Okunabilir dizeler bloglarda çalışır, çünkü aranabilirliği artırabilirler ve kayıt sayısı az olduğunda benzersiz başlıklar oluşturmak çok daha kolaydır.


1

İçerik karmaları

"Karma" kelimesi varolan, hoş cevaplarda bulunmaz, işte başlıyoruz:

Genellikle, veriler bağımsız, yapay bir kimlik yerine içerik karma ile tanımlanabilir. gitZFS gibi yazılımlarda veya dosya sistemlerinde özellikle belirgindir, burada içerik karma kullanımının bu özelliği sadece işleri kolaylaştırmakla kalmaz (örneğin çift kopyalamayı kaldırmakla kalmaz), aynı zamanda önemsiz önbellekleme, güvenli bir geçmiş, bit çürüklüğü algılaması gibi başka hoş özelliklere de sahiptir. vb.

Hash'ler genellikle onaltılık sayılar (veya daha büyük bir harf alanı) olarak gelir, bu yüzden tamsayı kimlikleri görmezsiniz. Basitçe var olan (bu durumda) hiçbir tamsayılar.

Veri nesnelerinizin değişmez olması durumunda kareler iyidir (ZFS'de olduğu gibi git); görüntüleri büyük CDN'lerde depolamak için harika olurlar. Ben özellikle bu kimlikleri aslında olup olmadığını bilmiyorum vardır karmaları, ama kesinlikle mantıklı olur (ve Michael Kjorlıng yorumladı olarak, kısa kimlikleri bilinen nedenlerle karmaları muhtemelen değildir - karşılaştırma olarak, git 20 bayt veya 40 olan SHA-1 değerleri kullanır altıgen rakam).


1
En azından Youtube video kimlikleri karma olması için çok kısa. Doğum paradoksu geçerlidir; Kısacası, ortalama olarak, n bitlik bir karma alanıyla, 2 ^ (n / 2) giriş bloğu gördükten sonra çarpışmaları görmeye başlayacaksınız. Kimlikte ~ 60-70 bit olduğunda, bu 30-35 benzersizlik veya birkaç milyar girdidir. Şu ana kadar bundan daha fazla video barındırdıklarından eminim. Ve elbette, çoğu karma tam sayıdır; normalde ondalık biçimde basılmadıklarından, tamsayı olup olmadıklarına hiçbir etkisi yoktur. Kuşkusuz, aynı veri muhtemelen kayan nokta ikili verileri olarak da yorumlanabilir ...
CVn'de

3
@ MichaelKjörling: YouTube video kimlikleri, kriptografik karmaşalar için çok kısa , ancak 64 bit veya daha az çıktılı birçok karma işlevi var - CRC-16/32/64, Java hashCode(), vb. karma, daha muhtemel rastgele çarpışmalar.
dan04

İnsanların URL'yi hatırlamalarını isteseniz, bunu büyük / küçük harf anlamlı hale getirmezdiniz. Ve her harfin önünde "üst" veya "alt" demek, sadece sayılardan çok daha az etkilidir.
Lenne

0

Tamam nedenlerinden biri, karakterlerin karakter olarak gönderilip, tamsayı olarak gönderilmemesidir. Bunun nedeni bir HTTP Get'in nasıl çalıştığıdır.

"Neden bir tamsayı kullanmıyorsun?" Derken Peki, tam sayı daha sonra kesilir ve her hane bir karakter olarak gönderilir ve bir şekilde bir karakter dizisi ile sona erer. Peki neden bir karakter için tüm seçenekleri kullanmıyorsunuz?

İnsan faktörü de var:

Örneğin imgur atın: https://imgur.com/ ***** / s6UqP

s6UqP,

Her karakter için aralık: a'dan z'ye büyük harf, a'dan z'ye büyük harf ve 0'dan 9'a kadar = 26+ 26+ 10 = 62, dizedeki her konum için seçenekler. Beş pozisyon ile 916132832 olası kombinasyonlar. Yalnızca rakamları kullanırsanız, 9 haneye ihtiyacınız olacaktır.

İnsanlar yaklaşık 7 nesneyi hafızada tutabilir, 9 hane çok fazla, 5 karakter yapılabilir.

Büyülü sayı 7


Gfycat'ı hatırlıyor: üç kelime, iki sıfat ve bir hayvan adı kullanıyorlar. Çünkü birçok olasılık ( 1502 ayarlayıcı ve 1751 hayvan ), sadece üç nesne kullanarak 3 milyardan fazla kombinasyona sahipler.
Gustavo Rodrigues
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.