Quando você usaria um longo ID de string em vez de um inteiro simples? [fechadas]

53

Eu gostaria de usar o Youtube como exemplo: eles usam IDs na forma de PEckzwggd78 .

Por que eles não usam números inteiros simples?

Ou imgur.com - eles também usam IDs como 9b6tMZS para imagens e galerias. Não inteiros sequenciais.

  • Por que eles não usam números inteiros (particularmente os sequenciais)?

  • Em quais casos é uma decisão sábia usar tais IDs de string em vez de inteiros?

por Rakori 28.11.2017 / 07:33
fonte

10 respostas

100

O YouTube não pode usar IDs sequenciais por dois motivos:

  1. Seus bancos de dados quase certamente são distribuídos, tornando a numeração sequencial complicada.

  2. Tem uma opção de privacidade "Vídeos não listados": aqueles que não aparecem nos resultados da pesquisa, mas estão disponíveis se você souber o ID.

Portanto, os IDs de vídeo devem ser razoavelmente aleatórios e imprevisíveis. Se o ID é representado apenas por dígitos, ou por uma combinação de letras e dígitos, é irrelevante: há um mapeamento trivial de uma representação para outra.

    
por 28.11.2017 / 10:57
fonte
75
  • Na forma dos IDs: eles estão usando o Base64 (usando os caracteres a - z , A - Z , 0 - 9 , - , e _ ). Isso permite que eles tenham 6 bits de informação por caractere. O YouTube usa IDs de vídeo de 11 caracteres, o que significa que eles podem gerar 2 6 * 11 ou mais de 7 * 10 19 IDs. Como Tom Scott colocou , isso é "o suficiente para cada ser humano no planeta Terra carregar um vídeo a cada minuto por cerca de 18.000 anos ". O Base64 também é fácil de trabalhar, porque 64 é uma potência de 2, o que significa que cada caractere representa um número exato de bits. Usamos hexadecimal (base 16) pelo mesmo motivo.

  • Sobre a natureza não sequencial dos IDs: significa que eles não precisam de um contador sincronizado entre todos os servidores que atribuem códigos aos vídeos. Eles podem apenas gerar um número aleatório, verificar se ele já está em uso e partir daí. Eles podem até atribuir a cada servidor um bloco de IDs para escolher e eliminar a verificação de duplicação. Eu não sei se eles estão fazendo isso, mas eles poderiam.

  • Outro motivo para os IDs não sequenciais é que é o que faz com que os vídeos "não listados" funcionem. Estes são vídeos que não aparecem nos resultados de pesquisa ou como sugestões, mas que são acessíveis se você tiver o link. Se você estiver usando a contagem sequencial, basta ir a um vídeo, aumentar o ID em um e a ideia de vídeos não listados está quebrada.

  • IDs não sequenciais também ajudam a ocultar informações de concorrentes, como a quantidade total de vídeos ou o número de vídeos enviados por período de tempo.

Eu recomendo altamente o vídeo de Tom Scott . Sua informação é quase sempre interessante e precisa.

    
por 28.11.2017 / 12:09
fonte
13
  • Os números inteiros não se ajustam tão bem, um número inteiro sem sinal de 32 bits "normal" atingirá um máximo de pouco mais de 4 bilhões.

  • Eles podem não querer que você saiba quantos itens eles têm on-line ou acompanhar a taxa que estão aumentando.

  • As letras podem conter mais informações do que dígitos, você precisa de menos letras para expressar o mesmo "número". Para um grande banco de dados de indexadores, isso pode aumentar.

por 28.11.2017 / 07:44
fonte
8

1) Por que alguns sites usam letras em seus IDs? São cordas?

Não sabemos se esses sites armazenam IDs no banco de dados como strings. Números e seqüências de caracteres são realmente os mesmos para computadores. Uma string é apenas um número, mostrado apenas com uma base diferente. 'A' = 0x41 = 65 = 0b1000001 , para o computador é tudo igual. Mas se você exibi-lo, quanto maior a base, menor a representação e URLs menores serão mais fáceis de ler e compartilhar para os humanos. Sites como o YouTube e o Imgur usam a base 62 (letras maiúsculas e minúsculas, mais dígitos) ou maior (adicionar um traço ou outros caracteres de URL válidos), o que é relativamente curto para grandes números. O que você prefere usar, youtu.be/23489234892348234933 ou youtu.be/B9k6KMrv8vh ?

2) Por que os IDs não seqüenciais são usados?

A resposta do IMil explica bem:

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.

Isso também explica por que os IDs são tão grandes: (o YouTube não hospeda 23.489.234.892.348.234.933 vídeos diferentes, obviamente)

  • Ao gerar IDs, é um problema se você gerar acidentalmente o mesmo ID duas vezes, então você precisa de um grande espaço de ID para evitar o problema do aniversário

  • As pessoas podem adivinhar o URL de vídeos não listados se a chance de qualquer ID válido ser usado para um vídeo não ser muito, muito pequena.

por 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?

  • Melhor espaço UTF-8 - quando você transforma um número em uma string, obtém no máximo 10 combinações por caractere (0-9), mas quando você permite caracteres alfa-numéricos, obtém 62 combinações por caractere (az, AZ, 0-9), portanto, usando seqüências alfanuméricas, você pode produzir URLs mais curtos do que se usasse strings numéricas. Isso é importante para sites em que os usuários estão compartilhando URLs - como o Youtube e o Imgur.
  • Inteiros sequenciais são mais difíceis de produzir. Para produzir um número inteiro crescente sequencial, você deve ter um único segmento para produzir os números ou coordenar muitos hosts em um sistema distribuído e quando executar um aplicativo de alto volume como o Youtube ou o Imgur que não dimensiona tão bem quanto uma string gerada aleatoriamente (para não dizer que eles são gerados aleatoriamente)

Como um aparte, não é necessariamente o caso que a representação interna é uma string. Eles poderiam muito provavelmente estar codificando um identificador numérico como uma string alfanumérica para o URL mais curto.

    
por 28.11.2017 / 07:44
fonte
2

Como você apontou, seria fácil usar um ID universalmente exclusivo usando apenas números, porque no fundo tudo é apenas 0 e 1 e você poderia expandir o número para mais precisão indo até 128 pouco ou mais.

Eu acho que o principal motivo é que, assumindo algum intervalo fixo arbitrário como uint32 (apenas por exemplo), se você usar letras também, você pode ter um ID menor no total.

Eu imagino que seja uma razão estética para o URL. Em vez de ter 4,129,873,773 com letras, é muito mais curto Fu837t (apenas fictício feito por mim). Um usuário pode até ser capaz de lembrar o URL para dar a um amigo. Plataformas como o Youtube geralmente têm UUIDs mais longos que 32 bits, porque ficariam sem espaço rapidamente.

    
por 28.11.2017 / 09:46
fonte
2

Um URL curto é desejável, pois facilita a vinculação e o compartilhamento (por exemplo, você pode compartilhar um link em um SMS, é mais rápido digitar e assim por diante). Serviços como o Youtube ou o Imgurl querem que você compartilhe URLs casualmente, então essa é uma consideração importante.

Usando IDs alfanuméricos em vez de numéricos, você precisa de menos caracteres para expressar um ID com o mesmo tamanho de bit. Por exemplo, 6 dígitos dão a você um milhão de IDs únicos, mas 6 caracteres alfanuméricos (usando o conjunto base64) oferecem 68 identificadores exclusivos bilhões .

Por tudo o que sabemos, os identificadores alfanuméricos podem ser números sequenciais, apenas codificados em um formato alfanumérico como base64. Mas, muitas vezes, os serviços comerciais evitam códigos sequenciais para impedir que as pessoas adivinham identidades e evitem divulgar informações comerciais como a quantidade de clientes.

    
por 28.11.2017 / 13:44
fonte
1

Existem vários motivos pelos quais você usaria IDs não numéricos, mas também entende que nem todos os valores com caracteres alfabéticos são realmente strings. O YouTube tem a reputação de um número incrível de vídeos, da ordem de 300 horas de vídeo enviados a cada minuto ( ref ) . Os inteiros exclusivos que representam esses vídeos podem ficar bastante longos, portanto, use algo como os números codificados com a URL Base64 ( ref ).

Tipos de representações identificadoras:

  • Inteiros simples: (12345, 981027489382493)
  • Base 16 inteiros: 123456789abcdef - também conhecido como Hex
  • Base de 64 inteiros: 9b6tMZS
  • Strings legíveis: 12032017-Read-my-awesome-article-01

Todos eles têm seus pontos strongs e fracos. Quanto mais caracteres únicos você puder usar para seus identificadores, menos caracteres precisará para representar um número. Os números da base 64 são um bom compromisso porque existe uma variante estabelecida que funciona para URLs e comprime o número de caracteres necessários para representar um número 6 a 8 (ou seja, 3/4 do tamanho).

As cadeias legíveis funcionam em blogs porque podem aumentar a capacidade de pesquisa e é muito mais fácil gerar títulos únicos quando o número de registros é pequeno.

    
por 28.11.2017 / 15:11
fonte
1

hashes de conteúdo

A palavra "hash" não é encontrada nas respostas legais, então aqui vamos nós:

Geralmente, os dados podem ser identificados pelo seu hash de conteúdo em vez de um ID artificial independente. Isso é particularmente evidente em softwares como git ou sistemas de arquivos como o ZFS, onde essa propriedade específica de usar hashes de conteúdo não apenas torna as coisas mais fáceis (por exemplo, desduplicação), mas também possui outras propriedades interessantes como cache trivial, histórico seguro, detecção de podridão, etc.

Os hashes geralmente vêm como números hexadecimais (ou um espaço de letras ainda maior), por isso você não vê IDs inteiros. Há simplesmente são não inteiros (nesses casos).

Hashes são bons se seus objetos de dados são imutáveis (como no ZFS ou git ); eles seriam ótimos para armazenar imagens, por exemplo, em grandes CDNs. Eu não sei se esses IDs em particular são hashes, mas certamente faria sentido (e como Michael Kjörling comentou, short IDs provavelmente não são hashes por razões óbvias - como Comparação, git usa valores SHA-1 que são 20 bytes ou 40 dígitos hexadecimais).

    
por 28.11.2017 / 13:13
fonte
0

Ok, uma das razões é que os personagens são enviados como personagens e não como inteiros. Isso é por causa de como um HTTP Get funciona.

Quando você diz "por que não usar um inteiro?" Bem, o inteiro é então cortado e cada dígito é enviado como um personagem e você acaba com uma seqüência de caracteres de qualquer maneira. Então, por que não usar todas as opções para um personagem?

Existe também o fator humano:

Veja o imgur, por exemplo: link ***** / s6UqP

s6UqP,

O intervalo para todos os caracteres é: capital de a a z, sub-capital de aaz e de 0 a 9 = 26+ 26+ 10 = 62 opções para todas as posições na sequência. Com cinco posições, 916132832 combinações possíveis. Se você usasse apenas números, precisaria de 9 dígitos.

As pessoas podem ter aproximadamente 7 objetos na memória, 9 dígitos é demais, 5 caracteres são factíveis.

Número mágico 7

    
por 28.11.2017 / 13:19
fonte