Kapan Anda akan menggunakan ID string yang panjang dan bukannya bilangan bulat sederhana? [Tutup]

54

Saya ingin menggunakan Youtube sebagai contoh: mereka menggunakan ID dalam bentuk PEckzwggd78.

Mengapa mereka tidak menggunakan bilangan bulat sederhana?

Atau imgur.com - mereka juga menggunakan ID seperti 9b6tMZSuntuk gambar dan galeri. Bukan bilangan bulat berurutan.

  • Mengapa mereka tidak menggunakan bilangan bulat (terutama yang berurutan)?

  • Dalam kasus apa itu keputusan bijak untuk menggunakan ID string seperti itu daripada bilangan bulat?

Rakori
sumber
47
Apa yang membuat Anda percaya ID bukan hanya bilangan bulat sederhana? Saya tahu banyak layanan web yang menggunakan integer di DB tetapi menampilkannya dalam beberapa encoding base64 sehingga URL terlihat lebih bagus. Menariknya, ID youtube hampir peta ke integer 64bit.
Josef
2
@ rwong Tapi pertanyaan OP adalah mengapa mereka tidak menggunakan ID numerik dan jawabannya mungkin: Mereka menggunakan ID numerik, mereka hanya menampilkannya di base64 bukan base10 atau base2. Saya tidak tahu pasti, jadi saya bertanya OP apa yang membuat mereka berpikir ID tidak sederhana integer 64bit di base64.
Josef
3
Bukankah itu sama dengan ini .
the_lotus

Jawaban:

101

Youtube tidak dapat menggunakan ID berurutan karena dua alasan:

  1. Basis datanya hampir pasti didistribusikan, membuat penomoran berurutan menjadi rumit.

  2. Ini memiliki opsi privasi "Video tidak terdaftar": yang tidak muncul di hasil pencarian, tetapi tersedia jika Anda mengetahui ID.

Oleh karena itu, ID video harus acak dan tidak dapat diprediksi. Apakah ID diwakili oleh digit saja, atau dengan kombinasi huruf dan digit, tidak relevan: ada pemetaan sepele dari satu representasi ke yang lain.

IMIL
sumber
11
Id angka tidak harus berurutan
Sopel
28
@Opel Saya pikir poin IMil adalah bahwa Youtube perlu membuat ID yang jarang. Dengan kata lain, jika diperkirakan bahwa Anda hanya perlu menyimpan 2^40barang, di beberapa arsitektur ada alasan yang sah untuk memilih ruang 2^80atau 2^120bit. Contoh alasannya adalah: mengurangi tabrakan tanpa secara teknis memeriksa tabrakan; menggunakan jarangnya kunci sebagai bagian dari membuat rahasia sulit ditemukan ("video tidak terdaftar"), dll.
rwong
13
@Opel pertanyaannya adalah "Mengapa mereka tidak menggunakan bilangan bulat (terutama yang berurutan)?" Saya menjelaskan bahwa: 1) ID berurutan tidak diinginkan; 2) bilangan bulat dan string pada dasarnya adalah hal yang sama
IMil
3
Klausa "karena itu" tidak secara logis mengikuti tetapi dua poin bernomor sudah benar. Sebagai contoh mengapa keacakan bukan konsekuensi yang perlu: penomoran berurutan dengan kesenjangan yang seragam akan berfungsi untuk memberikan id unik di beberapa basis data independen sehingga hasilnya dapat digabungkan di pusat datawarehouse - ini adalah bentuk sharding. Artinya, misalkan Anda mengantisipasi tidak lebih dari 10.000 basis data regional (mungkin Anda hanya memiliki 10 database saat ini sehingga 10.000 sudah mencukupi). Kemudian setiap db dapat memiliki kolom identitas yang dihitung oleh 10.000 dengan 4 digit terakhir yang unik, tidak akan ada tabrakan pada penggabungan.
davidbak
2
@davidbak persyaratan untuk keacakan mengikuti dari (2). Keunikan memang dapat diperoleh dengan menetapkan rentang non-tumpang tindih untuk contoh database yang berbeda, tetapi ini akan membuat ID dapat diprediksi.
IMil
75
  • Pada bentuk ID: Mereka menggunakan Base64 (menggunakan karakter a- z, A- Z, 0- 9, -, dan _). Ini memungkinkan mereka untuk memiliki 6 bit informasi per karakter. YouTube menggunakan ID video 11-karakter, yang berarti mereka dapat menghasilkan 2 6 * 11 , atau lebih dari 7 * 10 19 ID. Seperti yang dikatakan Tom Scott , itu "cukup bagi setiap manusia di planet Bumi untuk mengunggah video setiap menit selama sekitar 18.000 tahun." Base64 juga mudah digunakan, karena 64 adalah kekuatan 2, yang berarti setiap karakter mewakili jumlah bit yang tepat. Kami menggunakan heksadesimal (basis 16) untuk alasan yang sama.

  • Pada sifat ID yang tidak berurutan: itu berarti mereka tidak memerlukan penghitung yang disinkronkan antara semua server yang menetapkan ID untuk video. Mereka hanya dapat menghasilkan nomor acak, memeriksa apakah sudah digunakan, dan pergi dari sana. Mereka bahkan dapat menetapkan setiap server satu blok ID untuk dipilih dan menghilangkan pemeriksaan duplikasi. Saya tidak tahu apakah mereka melakukan itu, tetapi mereka bisa.

  • Alasan lain untuk ID non-sekuensial adalah karena inilah yang membuat video "tidak terdaftar" berfungsi. Ini adalah video yang tidak akan muncul di hasil pencarian atau sebagai saran, tetapi dapat diakses jika Anda memiliki tautan. Jika Anda menggunakan penghitungan berurutan, Anda bisa pergi ke video, menambah ID dengan satu, dan gagasan video tidak terdaftar sekarang rusak.

  • ID non-sekuensial juga membantu menyembunyikan informasi dari pesaing, seperti jumlah total video, atau jumlah video yang diunggah per kerangka waktu.

Saya sangat merekomendasikan video Tom Scott . Informasinya hampir selalu menarik dan akurat.

rchard2scout
sumber
6
Mari kita tunjukkan juga bahwa 11 karakter dari encoding base64 menyimpan 66 bit informasi, yang berarti mereka dapat dengan mudah memetakan integer 64bit ke dalam string semacam itu. Yaitu secara internal, mereka bisa menggunakan int 64bit pula (tetapi tidak perlu melakukannya).
Bernhard Hiller
1
Sebagai perbandingan, representasi desimal konvensional dapat membutuhkan sebanyak 20 karakter, "buang-buang" hingga 9 karakter dibandingkan dengan Base64.
dan04
Video Tom Scott menjelaskan ini dengan sempurna.
AGB
13
  • Integer tidak mengukur skala itu dengan baik, integer unsigned 32-bit "normal" akan maksimal lebih dari 4 miliar.

  • Mereka mungkin tidak ingin Anda tahu berapa banyak barang yang mereka miliki secara online atau melacak laju pertumbuhannya.

  • Surat dapat menampung lebih banyak informasi daripada angka, Anda membutuhkan lebih sedikit surat untuk mengekspresikan "angka" yang sama. Untuk database pengindeks besar ini bisa bertambah.

Martin Maat
sumber
7
1) seseorang dapat menggunakan int 64
Rakori
4
2) mengapa? ........... Mereka semua bersifat publik. yang tidak umum - tidak dapat diakses. itu dia
Rakori
3
3) dapatkah Anda menjelaskan? mengungkapkan informasi apa?
Rakori
2
Untuk 1: yang sama berlaku untuk int32 dan int64. Sementara int64 berpotensi jauh lebih besar, itu mungkin tidak cukup besar.
Nepho
3
Dalam database Anda akan menyimpan nomor sebagai nomor. Jadi int 32 bit akan mengambil 32 bit. Teks akan memiliki kepadatan lebih sedikit (seberapa banyak teks yang lebih buruk tergantung pada penyandian)
Taemyr
8

1) Mengapa beberapa situs web menggunakan surat dalam ID mereka? Apakah mereka string?

Kami tidak tahu apakah situs web tersebut menyimpan ID dalam database mereka sebagai string. Angka dan string benar-benar sama dengan komputer. String hanyalah angka, hanya ditampilkan dengan basis yang berbeda. 'A' = 0x41 = 65 = 0b1000001, ke komputer itu semua sama. Tetapi jika Anda menampilkannya, semakin besar alasnya, semakin pendek penyajiannya, dan URL yang lebih pendek lebih mudah dibaca dan dibagikan untuk manusia. Situs-situs seperti YouTube dan Imgur menggunakan basis 62 (huruf, huruf besar dan kecil, plus digit) atau lebih besar (tambahkan tanda hubung atau karakter URL yang valid lainnya), yang relatif pendek untuk angka besar. Apa yang ingin Anda gunakan, youtu.be/23489234892348234933atau youtu.be/B9k6KMrv8vh?

2) Mengapa ID non-berurutan digunakan?

Jawaban oleh IMil menjelaskannya dengan baik:

Youtube tidak dapat menggunakan ID berurutan karena dua alasan:

  • Basis datanya hampir pasti didistribusikan, membuat penomoran berurutan menjadi rumit.

  • Ini memiliki opsi privasi "Video tidak terdaftar": yang tidak muncul di hasil pencarian, tetapi tersedia jika Anda mengetahui ID.

Ini juga menjelaskan mengapa ID begitu besar: (YouTube tidak meng-host 23.489.234.892.344.234.933 video berbeda, jelas)

  • Saat membuat ID, itu masalah jika Anda secara tidak sengaja menghasilkan ID yang sama dua kali, jadi Anda membutuhkan ruang ID besar untuk mencegah masalah ulang tahun

  • Orang-orang hanya dapat menebak URL video yang tidak terdaftar jika peluang setiap ID yang valid yang digunakan untuk video tidak terlalu, sangat kecil.

Jasmijn
sumber
3
> "YouTube tidak meng-host 23.489.234.892.348.234.933 video berbeda, jelas" Saya tidak begitu yakin apakah ini jelas atau tidak;)
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.- bagaimana Anda tahu jika video tidak terdaftar tidak dapat diakses untuk semua orang kecuali pembuatnya? bahkan jika orang lain sudah menebak ID-nya
Rakori
2
@progo Maksud saya jika setiap orang di dunia rata-rata telah mengunggah 3,3 miliar video ke YouTube ...;)
Jasmijn
5

mengapa tidak hanya bilangan bulat, terutama yang berurutan? Dan ketika, dalam kasus apa keputusan bijak untuk string ID seperti itu daripada bilangan bulat?

  • Ruang UTF-8 yang lebih baik - ketika Anda mengubah angka menjadi string, Anda mendapatkan paling banyak 10 kombinasi per karakter (0-9), tetapi ketika Anda mengizinkan karakter alfa numerik apa pun, Anda mendapatkan 62 kombinasi per karakter (az, AZ, 0-9 ), jadi dengan menggunakan string alfanumerik Anda dapat menghasilkan url yang lebih pendek daripada jika Anda menggunakan string numerik. Ini penting untuk situs tempat pengguna berbagi url - seperti Youtube dan Imgur.
  • Bilangan bulat berurutan lebih sulit untuk diproduksi. Untuk menghasilkan bilangan bulat yang meningkat secara berurutan Anda harus memiliki satu utas untuk menghasilkan angka, atau mengoordinasikan banyak host dalam sistem terdistribusi, dan ketika Anda menjalankan aplikasi volume tinggi seperti Youtube atau Imgur yang tidak menskala sebaik string yang dihasilkan secara acak (bukan untuk mengatakan bahwa mereka sedang secara acak menghasilkan)

Sebagai tambahan, itu tidak selalu berarti bahwa representasi internal adalah sebuah string. Mereka sangat mungkin mengkodekan pengenal angka sebagai string alfanumerik untuk url yang lebih pendek.

Samuel
sumber
1
2) dalam hal ID string, tetapi Anda harus memverifikasi bahwa ID string telah dibuat sebelum memasukkan catatan baru ke db. lalu apa bedanya dengan ID int?
Rakori
@Rakorin Bahkan ketika menggunakan sesuatu yang sederhana seperti UUIDv4, peluang untuk berkolusi sangat kecil. Gunakan cukup keacakan dan peluangnya cukup tidak ada, sehingga duplikat tidak benar-benar perlu divalidasi.
Andy
1
@davidpacker dan apa bedanya dengan menghasilkan integer yang lebih panjang?
Sopel
@Opel Seperti yang ditunjukkan Samuel, bilangan bulat akan mengambil lebih banyak ruang, yaitu lebih lama, daripada string. Kalau tidak, sebenarnya tidak ada perbedaan.
Andy
1
@davidpacker hanya saat dicetak
Sopel
2

Seperti yang telah Anda tunjukkan bahwa akan mudah untuk menggunakan ID unik yang universal hanya menggunakan angka karena di bawah kap semuanya adil 0dan 1dan Anda dapat memperluas nomor menjadi lebih presisi hingga 128 bit atau lebih.

Saya pikir alasan utama adalah bahwa, dengan asumsi beberapa rentang tetap sewenang-wenang seperti uint32(hanya untuk contoh), jika Anda menggunakan huruf juga Anda dapat memiliki ID yang lebih pendek secara total.

Saya membayangkan bahwa ini adalah alasan estetika untuk URL tersebut. Alih-alih 4,129,873,773dengan surat itu jauh lebih pendek Fu837t(hanya dibuat-buat oleh saya). Seorang pengguna bahkan mungkin dapat mengingat URL untuk memberikannya kepada seorang teman. Platform seperti Youtube biasanya memiliki UUID lebih lama dari 32 bit karena mereka akan kehabisan ruang dengan cepat.

Ewald B.
sumber
3
Ini menurut saya jawabannya. Menggunakan string tidak lebih efisien atau lebih mudah untuk mempertahankan keunikan. Alasannya adalah karena lebih mudah direpresentasikan sebagai url
Sopel
jika pengguna dapat mengingat Fu837t, tetapi tidak bisakah dia mengingat 2390?
Rakori
4
@ Rakori: Fu837t akan dibandingkan dengan 2223955238, jadi ya. 2390 akan dikodekan sebagai "Vg", jadi: juga ya.
Mooing Duck
@ MoooDuck, tidak. Bagaimana Anda tahu apa algoritma untuk menghasilkan string ID itu?
Rakori
3
@ Rakori itu bukan algoritma, ini adalah pengkodean. Ada beberapa algoritma untuk mentransfer angka di antara pengkodean yang berbeda, tetapi yang digunakan tidak masalah selama pengkodean didefinisikan dengan baik. Pengkodean base64 aman Url sudah dikenal dan distandarisasi .
Josef
2

URL pendek diinginkan karena membuat tautan dan berbagi menjadi lebih mudah (mis. Anda dapat membagikan tautan dalam SMS, lebih cepat untuk mengetik dan sebagainya). Layanan seperti Youtube atau Imgurl ingin Anda berbagi URL dengan santai, jadi ini merupakan pertimbangan penting.

Menggunakan ID alfanumerik daripada angka berarti Anda membutuhkan lebih sedikit karakter untuk mengekspresikan ID dengan ukuran bit yang sama. Misalnya 6 digit memberi Anda satu juta id unik tetapi 6 karakter alfanumerik (menggunakan perangkat base64) memberi Anda 68 miliar pengidentifikasi unik.

Sejauh yang kita tahu, pengidentifikasi alfanumerik bisa berupa angka berurutan, hanya dikodekan dalam format alfanumerik seperti base64. Tetapi seringkali layanan komersial menghindari kode berurutan untuk mencegah orang menebak ID dan untuk menghindari pengungkapan informasi bisnis seperti jumlah pelanggan.

JacquesB
sumber
1

Ada beberapa alasan mengapa Anda akan menggunakan id non-numerik, tetapi juga memahami bahwa tidak semua nilai dengan karakter alfabet benar-benar string. YouTube memiliki reputasi jumlah video yang luar biasa, dengan urutan 300 jam video yang diunggah setiap menit ( ref ). Bilangan bulat unik yang mewakili video-video itu bisa cukup lama, jadi gunakan sesuatu seperti angka yang disandikan URL Base64 ( ref ).

Jenis Representasi Identifier:

  • Bilangan bulat sederhana: (12345, 981027489382493)
  • Basis 16 bilangan bulat: 123456789abcdef - juga dikenal sebagai Hex
  • Basis 64 integer: 9b6tMZS
  • String yang dapat dibaca: 12032017-Read-my-awesome-article-01

Mereka semua memiliki kekuatan dan kelemahan mereka. Semakin unik karakter yang dapat Anda gunakan untuk pengidentifikasi Anda, semakin sedikit karakter yang Anda butuhkan untuk merepresentasikan angka. Basis nomor 64 adalah kompromi yang cukup bagus karena ada varian yang berfungsi untuk URL dan mengompres jumlah karakter yang diperlukan untuk mewakili angka 6 hingga 8 (yaitu ukuran 3/4).

String yang dapat dibaca berfungsi untuk blog karena mereka dapat meningkatkan kemampuan pencarian, dan jauh lebih mudah untuk menghasilkan judul yang unik ketika jumlah catatan kecil.

Berin Loritsch
sumber
1

Hash konten

Kata "hash" tidak ditemukan dalam jawaban yang ada, bagus, jadi di sini kita mulai:

Seringkali, data dapat diidentifikasi dengan hash isinya daripada ID buatan yang independen. Ini sangat jelas dalam perangkat lunak seperti gitatau sistem file seperti ZFS di mana properti khusus ini menggunakan hash konten tidak hanya membuat hal-hal lebih mudah (misalnya de-duplikasi), tetapi juga memiliki properti bagus lainnya seperti caching sepele, sejarah yang aman, mendeteksi bit busuk dll.

Hash biasanya berupa angka hex (atau ruang huruf yang lebih besar), jadi itu sebabnya Anda tidak melihat ID integer. Ada hanya yang ada bilangan bulat (dalam kasus-kasus).

Hash baik jika objek data Anda tidak dapat diubah (seperti di ZFS atau git); mereka akan bagus untuk menyimpan gambar, misalnya, pada CDN besar. Saya tidak tahu apakah mereka ID tertentu sebenarnya adalah hash, tapi itu pasti akan masuk akal (dan sebagai Michael Kjörling berkomentar, singkat ID mungkin tidak hash untuk alasan yang jelas - sebagai pembanding, git menggunakan nilai-nilai SHA-1 yang 20 byte atau 40 hex digit).

AnoE
sumber
1
Setidaknya ID video Youtube terlalu pendek untuk dijadikan hash. Paradoks ulang tahun berlaku; singkatnya, rata-rata, dengan ruang hash n bit, Anda akan mulai melihat tabrakan setelah melihat 2 ^ (n / 2) gumpalan input. Dengan ~ 60-70 bit dalam ID, itu 30-35 bit keunikan, atau beberapa miliar entri. Saya cukup yakin mereka meng-host lebih banyak video dari itu sekarang. Dan, tentu saja, sebagian besar hash adalah bilangan bulat; bahwa mereka biasanya tidak dicetak dalam bentuk desimal tidak ada hubungannya dengan apakah mereka bilangan bulat. Harus diakui, data yang sama mungkin dapat diartikan sebagai data biner titik-mengambang ...
CVn
3
@ MichaelKjörling: Ya, ID video YouTube terlalu pendek untuk dijadikan hash kriptografi , tetapi ada banyak fungsi hash yang memiliki 64 bit output atau kurang - CRC-16/32/64, Java hashCode(), dll. Tentu saja, semakin pendek hash, tabrakan acak lebih mungkin.
dan04
Jika Anda ingin orang-orang mengingat URL, Anda tidak akan membuatnya signifikan. Dan harus mengatakan "atas" atau "lebih rendah" di depan setiap huruf jauh lebih efisien daripada hanya mengatakan angka.
Lenne
0

Ok salah satu alasannya adalah bahwa karakter dikirim sebagai karakter dan bukan sebagai bilangan bulat. Ini karena cara kerja HTTP Get.

Ketika Anda berkata, "mengapa tidak menggunakan integer?" Nah, integer kemudian dicacah dan setiap digit dikirim sebagai karakter dan Anda berakhir dengan serangkaian karakter bagaimanapun. Jadi mengapa tidak menggunakan semua opsi untuk karakter?

Ada juga faktor manusia:

Ambil imgur misalnya: https://imgur.com/ ***** / s6UqP

s6UqP,

Rentang untuk setiap karakter adalah: a hingga z modal, sub-kapital z hingga, dan 0 hingga 9 = 26+ 26+ 10 = 62 opsi untuk setiap posisi dalam string. Dengan lima posisi itu 916132832 kemungkinan kombinasi. Jika Anda hanya menggunakan angka, Anda akan membutuhkan 9 digit.

Orang dapat menyimpan sekitar 7 objek dalam memori, 9 digit terlalu banyak, 5 karakter dapat dilakukan.

Angka ajaib 7

Pieter B
sumber
Itu mengingat Gfycat: mereka menggunakan tiga kata, dua kata sifat dan nama hewan. Karena ada banyak kemungkinan ( 1502 adjetives dan 1751 hewan ) mereka memiliki lebih dari 3 miliar kombinasi hanya menggunakan tiga objek.
Gustavo Rodrigues