Quando useresti un ID stringa lungo, invece di un intero semplice? [chiuso]

53

Mi piacerebbe usare Youtube come esempio: usano gli ID sotto forma di PEckzwggd78 .

Perché non usano numeri interi semplici?

O imgur.com - usano anche ID come 9b6tMZS per immagini e gallerie. Numeri interi non sequenziali.

  • Perché non usano interi (in particolare quelli sequenziali)?

  • In quali casi è una saggia decisione di utilizzare tali ID stringa anziché i numeri interi?

posta Rakori 28.11.2017 - 07:33
fonte

10 risposte

100

YouTube non può utilizzare ID sequenziali per due motivi:

  1. I suoi database sono quasi certamente distribuiti, rendendo complicata la numerazione sequenziale.

  2. Ha un'opzione di privacy "Video non in elenco": quelli che non compaiono nei risultati di ricerca, ma sono disponibili se si conosce l'ID.

Pertanto, gli ID video dovrebbero essere ragionevolmente casuali e imprevedibili. Se l'ID è rappresentato solo da cifre o da una combinazione di lettere e cifre, è irrilevante: c'è una mappatura banale da una rappresentazione all'altra.

    
risposta data 28.11.2017 - 10:57
fonte
75
  • Sulla forma degli ID: stanno usando Base64 (usando i caratteri a - z , A - Z , 0 - 9 , - , e _ ). Ciò consente loro di avere 6 bit di informazione per carattere. YouTube utilizza ID video di 11 caratteri, il che significa che possono generare 2 6 * 11 o più di 7 * 10 19 ID. Come Tom Scott ha messo , questo è "abbastanza per ogni singolo essere umano sul pianeta Terra per caricare un video ogni minuto per circa 18.000 anni. " Base64 è anche facile da lavorare, perché 64 è una potenza di 2, il che significa che ogni carattere rappresenta un numero esatto di bit. Utilizziamo esadecimale (base 16) per lo stesso motivo.

  • Sulla natura non sequenziale degli ID: significa che non è necessario un contatore sincronizzato tra tutti i server che assegnano gli ID ai video. Possono solo generare un numero casuale, verificare se è già in uso e andare da lì. Potrebbero persino assegnare a ciascun server un blocco di ID da cui prelevare ed eliminare il controllo della duplicazione. Non so se lo stanno facendo, ma potrebbero farlo.

  • Un altro motivo per gli ID non sequenziali è che è ciò che rende funzionanti i video "non in elenco". Questi sono video che non verranno visualizzati nei risultati di ricerca o come suggerimenti, ma che sono accessibili se hai il link. Se utilizzi il conteggio sequenziale, puoi semplicemente andare a un video, aumentare l'ID di uno e l'idea di video non elencati è ora interrotta.

  • Gli ID non sequenziali aiutano anche a nascondere le informazioni dei concorrenti, come la quantità totale di video o il numero di video caricati per periodo.

Posso consigliare vivamente video di Tom Scott . Le sue informazioni sono quasi sempre interessanti e accurate.

    
risposta data 28.11.2017 - 12:09
fonte
13
  • I numeri interi non scalano così bene, un numero intero "normale" a 32 bit senza segno supera al massimo i 4 miliardi.

  • Potrebbero non voler sapere quanti oggetti hanno on line o tenere traccia del tasso che stanno crescendo.

  • Le lettere possono contenere più informazioni rispetto alle cifre, è necessario meno lettere per esprimere lo stesso "numero". Per un grande database di indicizzatori questo potrebbe sommarsi.

risposta data 28.11.2017 - 07:44
fonte
8

1) Perché alcuni siti Web utilizzano lettere nei loro ID? Sono stringhe?

Non sappiamo se quei siti web memorizzino gli ID nel loro database come stringhe. I numeri e le stringhe sono davvero gli stessi dei computer. Una stringa è solo un numero, appena mostrato con una base diversa. 'A' = 0x41 = 65 = 0b1000001 , al computer è tutto uguale. Ma se lo visualizzi, più grande è la base, più breve è la rappresentazione e gli URL più brevi sono più facili da leggere e condividere per gli umani. Siti come YouTube e Imgur usano la base 62 (lettere, maiuscole e minuscole, più cifre) o più grandi (aggiungi un trattino o altri caratteri URL validi), che è relativamente breve per i grandi numeri. Cosa preferiresti usare, youtu.be/23489234892348234933 o youtu.be/B9k6KMrv8vh ?

2) Perché vengono utilizzati ID non sequenziali?

La risposta di IMil lo spiega bene:

Youtube can't use sequentional IDs for two reasons:

  • Its databases are almost certainly distributed, making sequential numbering complicated.

  • It has a privacy option "Unlisted videos": those that don't show up in the search results, but are available if you know the ID.

Questi spiegano anche perché gli ID sono così grandi: (YouTube non ospita 23.489,234,892,348,234,933 video diversi, ovviamente)

  • Quando si generano gli ID, è un problema se si genera per errore lo stesso ID due volte, quindi è necessario un grande spazio ID per impedire il problema del compleanno

  • Le persone possono solo indovinare l'URL dei video non elencati se la possibilità che un determinato ID valido venga utilizzato per un video non è molto, molto piccola.

risposta data 28.11.2017 - 12:11
fonte
5

why not just integers, particularly sequential ones? And when, in what cases is it a wise decision to such string ID instead of integers?

  • Spazio UTF-8 migliore - quando trasformi un numero in una stringa ottieni al massimo 10 combinazioni per carattere (0-9), ma quando consenti a qualsiasi carattere alfa numerico ottieni 62 combinazioni per carattere (az, AZ, 0-9), quindi utilizzando stringhe alfanumeriche è possibile produrre URL più brevi rispetto a quando si utilizzano stringhe numeriche. Questo è importante per i siti in cui gli utenti condividono gli URL, come Youtube e Imgur.
  • Gli interi sequenziali sono più difficili da produrre. Per produrre un intero crescente sequenziale devi avere un singolo thread per produrre i numeri, o coordinare molti host in un sistema distribuito, e quando esegui un'applicazione ad alto volume come Youtube o Imgur che non è scalabile come una stringa generata casualmente (per non dire che sono generati casualmente)

Per inciso, non è necessariamente il caso che la rappresentazione interna sia una stringa. Probabilmente potrebbero codificare un identificatore numerico come stringa alfanumerica per l'URL più breve.

    
risposta data 28.11.2017 - 07:44
fonte
2

Come hai sottolineato, sarebbe facile utilizzare un ID universalmente univoco usando solo i numeri, perché sotto il cofano tutto è solo 0 e 1 e potresti espandere il numero a più precisione fino a 128 bit o più.

Penso che la ragione principale sia che, supponendo un intervallo fisso arbitrario come uint32 (solo per un esempio), se si usano anche le lettere si può avere un ID più breve in totale.

Immagino che sia un motivo estetico per l'URL. Invece di avere 4,129,873,773 con lettere è molto più corto Fu837t (solo fittizio inventato da me). Un utente potrebbe persino essere in grado di ricordare l'URL per darlo ad un amico. Piattaforme come Youtube di solito hanno UUID più lunghi di 32 bit perché esaurirebbero rapidamente lo spazio.

    
risposta data 28.11.2017 - 09:46
fonte
2

È preferibile un URL breve poiché semplifica il collegamento e la condivisione (ad es. puoi condividere un link in un SMS, è più veloce da digitare e così via). Servizi come Youtube o Imgurl vogliono che tu condivida gli URL casualmente, quindi questa è una considerazione importante.

L'utilizzo di ID alfanumerici anziché numerici significa che è necessario un numero inferiore di caratteri per esprimere un ID della stessa dimensione di bit. Ad esempio, 6 cifre ti danno un milione di ID univoci ma 6 caratteri alfanumerici (usando il set base64) ti danno 68 miliardi identificatori univoci.

Per quanto ne sappiamo, gli identificatori alfanumerici potrebbero essere numeri sequenziali, solo codificati in un formato alfanumerico come base64. Ma spesso i servizi commerciali evitano codici sequenziali per impedire alle persone di indovinare gli ID e di evitare di rivelare informazioni commerciali come la quantità di clienti.

    
risposta data 28.11.2017 - 13:44
fonte
1

Ci sono diversi motivi per cui useresti id non numerici, ma capisci anche che non tutti i valori con caratteri alfabetici sono realmente stringhe. YouTube ha la reputazione di un numero incredibile di video, dell'ordine di 300 ore di video caricati ogni minuto ( ref ) . Gli interi univoci che rappresentano questi video possono essere piuttosto lunghi, quindi utilizzare qualcosa come i numeri codificati con Base64 URL ( ref ).

Tipi di rappresentazioni degli identificatori:

  • Numeri interi semplici: (12345, 981027489382493)
  • Base 16 numeri interi: 123456789abcdef - noto anche come esadecimale
  • Base 64 numeri interi: 9b6tMZS
  • Stringhe leggibili: 12032017-Read-my-awesome-article-01

Tutti hanno i loro punti di forza e di debolezza. Più caratteri univoci puoi utilizzare per i tuoi identificatori, meno caratteri hai bisogno di rappresentare un numero. I numeri Base 64 sono un compromesso piuttosto buono perché esiste una variante stabilita che funziona per gli URL e comprime il numero di caratteri necessari per rappresentare un numero da 6 a 8 (cioè 3/4 della dimensione).

Le stringhe leggibili funzionano per i blog perché possono aumentare la ricercabilità ed è molto più semplice generare titoli univoci quando il numero di record è ridotto.

    
risposta data 28.11.2017 - 15:11
fonte
1

Hash del contenuto

La parola "hash" non è stata trovata nelle risposte esistenti, belle, quindi eccoci qui:

Spesso, i dati possono essere identificati dal suo hash del contenuto anziché da un ID artificiale indipendente. Ciò è particolarmente evidente in software come git o file system come ZFS, dove questa particolare proprietà dell'utilizzo degli hash del contenuto non solo semplifica le cose (ad esempio la deduplicazione), ma ha anche altre belle proprietà come il caching banale, una cronologia sicura, rilevamento di bit put ecc.

Gli hash di solito vengono come numeri esadecimali (o anche spazi letterali ancora più grandi), ecco perché non vedi gli ID interi. Semplicemente sono non interi (in quei casi).

Gli hash sono buoni se i tuoi oggetti dati sono immutabili (come in ZFS o git ); sarebbero perfetti per memorizzare le immagini, ad esempio, su CDN di grandi dimensioni. Non so se quegli ID particolari effettivamente sono hash, ma sarebbe sicuramente logico (e come ha commentato Michael Kjörling, gli ID brevi probabilmente non sono hash per ovvi motivi - come confronto, git usa valori SHA-1 che sono 20 byte o 40 cifre esadecimali).

    
risposta data 28.11.2017 - 13:13
fonte
0

Ok una delle ragioni è che i personaggi sono inviati come caratteri e non come numeri interi comunque. Questo a causa di come funziona HTTP Get.

Quando dici "perché non usi un intero?" Bene, il numero intero viene quindi sminuito e ogni cifra viene inviata come carattere e si finisce con una stringa di caratteri comunque. Allora perché non usare tutte le opzioni per un personaggio?

C'è anche il fattore umano:

Prendi imgur ad esempio: link ***** / s6UqP

s6UqP,

L'intervallo per ogni carattere è: da a a z capitale, da a a z sottocapo e da 0 a 9 = 26+ 26+ 10 = 62 opzioni per ogni posizione nella stringa. Con cinque posizioni, 916132832 combinazioni possibili. Se si usassero solo numeri, avresti bisogno di 9 cifre.

Le persone possono contenere approssimativamente 7 oggetti in memoria, 9 cifre sono troppe, 5 caratteri sono fattibili.

Numero magico 7

    
risposta data 28.11.2017 - 13:19
fonte

Leggi altre domande sui tag