Quando você usaria um ID longo, em vez de um número inteiro simples? [fechadas]

54

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 9b6tMZSimagens e galerias. Inteiros não sequenciais.

  • Por que eles não usam números inteiros (principalmente os seqüenciais)?

  • Em que casos é uma decisão sábia usar esses IDs de string em vez de números inteiros?

Rakori
fonte
47
O que faz você acreditar que os IDs não são apenas números inteiros simples? Conheço muitos serviços da Web que usam números inteiros no banco de dados, mas os exibem em alguma codificação base64, para que os URLs pareçam mais agradáveis. Curiosamente, os IDs do youtube quase mapeiam para números inteiros de 64 bits.
289 Josef Josef
2
@rwong Mas a pergunta dos OPs é por que eles não usam IDs numéricos e a resposta pode ser: Eles usam IDs numéricos, apenas os exibem em base64 em vez de base10 ou base2. Não sei ao certo, no entanto, estou perguntando ao OP o que especificamente os faz pensar que os IDs não são inteiros simples de 64 bits na base64.
28717 Josef
3
Não é o mesmo que isso .
precisa saber é o seguinte

Respostas:

101

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

  1. Seus bancos de dados são quase certamente distribuídos, dificultando a numeração seqüencial.

  2. Possui 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: existe um mapeamento trivial de uma representação para outra.

IMil
fonte
11
Numérico ids não tem que ser seqüencial
Sopel
28
@Sopel Acho que o ponto de IMil é que o YouTube precisa gerar IDs esparsos. Em outras palavras, se for estimado que você só precisará armazenar 2^40itens, em algumas arquiteturas existem razões legítimas para escolher um espaço 2^80ou 2^120bits. Exemplos de razões são: reduzir a colisão sem verificar tecnicamente a colisão; usando a escassez de chaves como parte do que faz segredos difíceis de encontrar (o "vídeo não listado"), etc.
rwong
13
@Sopel, a pergunta era "Por que eles não usam números inteiros (principalmente os seqüenciais)?" Explico que: 1) IDs seqüenciais são indesejados; 2) inteiros e strings são basicamente a mesma coisa
IMIL
3
A cláusula "portanto" não segue logicamente, mas os dois pontos numerados estão corretos. Como um exemplo do motivo pelo qual a aleatoriedade não é uma conseqüência necessária: a numeração seqüencial com intervalos uniformes funcionará para fornecer IDs únicos em vários bancos de dados independentes, de modo que os resultados possam ser combinados em um datawarehouse - essa é uma forma de fragmentação. Ou seja, suponha que você não preveja mais do que 10000 bancos de dados regionais (talvez você tenha apenas 10 no momento, portanto 10000 é suficiente). Então, cada banco de dados pode ter uma coluna de identidade contando até 10000 com os últimos 4 dígitos únicos; não haverá colisão na mesclagem.
Davidbak
2
@davidbak o requisito de aleatoriedade segue de (2). De fato, a exclusividade pode ser obtida atribuindo intervalos não sobrepostos a diferentes instâncias do banco de dados, mas isso deixaria os IDs previsíveis.
IMIL
75
  • Na forma dos IDs: Eles estão usando Base64 (usando os personagens 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 disse , "é o suficiente para cada ser humano no planeta Terra fazer upload de um vídeo a cada minuto por cerca de 18.000 anos". Também é fácil trabalhar com o Base64, 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 IDs aos vídeos. Eles podem gerar um número aleatório, verificar se ele já está em uso e partir daí. Eles poderiam até atribuir a cada servidor um bloco de IDs para escolher e eliminar a verificação de duplicação. Não sei se eles estão fazendo isso, mas poderiam.

  • Outro motivo para os IDs não sequenciais é que é o que faz os vídeos "não listados" funcionarem. São vídeos que não aparecem nos resultados de pesquisa ou como sugestões, mas 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 agora está quebrada.

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

Eu recomendo o vídeo de Tom Scott . Suas informações são quase sempre interessantes e precisas.

rchard2scout
fonte
6
Vamos também apontar que 11 caracteres de uma codificação base64 armazenam 66 bits de informação, o que significa que eles podem facilmente mapear um número inteiro de 64 bits em uma string. Ou seja, internamente, eles poderiam usar um int de 64 bits de qualquer maneira (mas não precisam fazê-lo).
Bernhard Hiller
11
Para comparação, a representação decimal convencional pode exigir até 20 caracteres, "desperdiçando" até 9 caracteres em comparação com o Base64.
precisa saber é
O vídeo de Tom Scott explica isso perfeitamente.
AGB 29/11
13
  • Os números inteiros não escalam tão bem, um número inteiro não assinado "normal" de 32 bits atingirá no máximo pouco mais de 4 bilhões.

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

  • 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 indexador, isso pode aumentar.

Martin Maat
fonte
7
1) pode-se usar int 64
Rakori 28/17/17
4
2) por que? ........... eles são todos públicos de qualquer maneira. aqueles que não são públicos - não são acessíveis. é isso
3
3) você pode elaborar? expressar quais informações?
Rakori
2
Para 1: o mesmo vale para int32 e int64. Embora o int64 seja potencialmente muito maior, ele pode não ser grande o suficiente.
Nepho 28/11
3
No banco de dados, você armazenaria um número como um número. Portanto, um int de 32 bits levaria 32 bits. Texto teria menos densidade (quanto mais pobre texto é dependeria de codificação)
Taemyr
8

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

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

2) Por que IDs não sequenciais são usados?

A resposta do IMil explica bem:

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

  • Seus bancos de dados são quase certamente distribuídos, dificultando a numeração seqüencial.

  • Possui 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.

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ê acidentalmente gerar o mesmo ID duas vezes, portanto, você precisa de um grande espaço de ID para evitar o problema de aniversário

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

Jasmijn
fonte
3
> "YouTube não hospeda 23.489.234.892.348.234.933 vídeos diferentes, obviamente," Eu não tenho tanta certeza se isso é óbvio ou não;)
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.- como você sabe se um vídeo não listado não está acessível para todos, exceto seu autor? mesmo que alguém tenha adivinhado seu ID
Rakori 28/11
2
@progo Quero dizer, se cada pessoa no mundo submeteu 3,3 bilhões de vídeos para o YouTube, em média ...;)
Jasmijn
5

por que não apenas números inteiros, particularmente seqüenciais? E quando, em que casos é uma decisão sábia para esse ID de string em vez de números inteiros?

  • Melhor espaço UTF-8 - quando você transforma um número em uma sequência, obtém no máximo 10 combinações por caractere (0-9), mas quando permite qualquer caractere alfa numérico, obtém 62 combinações por caractere (az, AZ, 0-9 ), portanto, usando cadeias alfanuméricas, você pode produzir URLs mais curtos do que se usasse cadeias numéricas. Isso é importante para sites em que os usuários estão compartilhando URLs - como Youtube e Imgur.
  • Inteiros seqüenciais são mais difíceis de produzir. Para produzir um número inteiro crescente sequencial, é necessário que um único encadeamento produza os números ou coordene vários hosts em um sistema distribuído e, quando você executa um aplicativo de alto volume como o Youtube ou o Imgur, que não é tão bem dimensionado quanto uma sequência gerada aleatoriamente (para não dizer que eles estão gerando aleatoriamente)

Como um aparte, não é necessariamente o caso que a representação interna é uma string. É muito provável que eles estejam codificando um identificador numérico como uma sequência alfanumérica para o URL mais curto.

Samuel
fonte
11
2) no caso de um ID de string, mas você precisará verificar se um ID de string já foi gerado antes de inserir um novo registro em um banco de dados. qual é a diferença com um ID int então?
Rakori 28/11
@Rakorin Mesmo quando se usa algo tão simples quanto o UUIDv4, a chance de colisão é minúscula. Use aleatoriedade suficiente e a chance é praticamente inexistente, para que a duplicidade não precise realmente ser validada.
28417 Andy
11
@davidpacker e como isso difere de gerar um número inteiro mais longo?
Sopel 28/11
@Sopel Como Samuel apontou, os números inteiros ocupariam mais espaço, ou seja, seriam mais longos do que as strings. Caso contrário, não há realmente nenhuma diferença.
28417 Andy
11
@davidpacker somente quando impresso #
Sopel
2

Como você apontou que seria fácil de usar um ID único universal usando apenas números, porque sob o capô tudo é apenas 0e 1e você poderia expandir o número para mais precisão que vai até 128 bits ou mais.

Eu acho que a principal razão é que, assumindo um intervalo fixo arbitrário como uint32(apenas por uma questão de exemplo), se você usar letras também poderá ter um ID mais curto no total.

Imagino que seja uma razão estética para a URL. Em vez de usar as 4,129,873,773letras, é muito mais curto Fu837t(apenas fictício por mim). Um usuário pode até lembrar o URL para fornecê-lo a um amigo. Plataformas como o YouTube geralmente têm UUIDs mais longos que 32 bits, porque ficam sem espaço rapidamente.

Ewald B.
fonte
3
Isso eu acho que é a resposta. O uso de strings não é mais eficiente nem fácil de manter a exclusividade. A razão é que é mais fácil para representar como um url
Sopel
se um usuário é capaz de se lembrar do Fu837t, mas não consegue se lembrar do 2390?
Rakori 28/11
4
@Rakori: Fu837t se compara a 2223955238, então sim. O 2390 seria codificado como "Vg", então: também sim.
Mooing Duck
@MooingDuck, não. Como você sabe qual é o algoritmo para gerar esse ID de string?
Rakori 29/11
3
@Roriori não é um algoritmo, é uma codificação. Existem algoritmos para transferir números entre codificações diferentes, mas qual deles é usado não importa, desde que a codificação esteja bem definida. A codificação base64 de URL segura é bem conhecida e padronizada .
Josef
2

Uma URL curta é 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 desejam que você compartilhe URLs casualmente, portanto, essa é uma consideração importante.

Usar IDs alfanuméricos em vez de numéricos significa que você precisa de menos caracteres para expressar um ID do mesmo tamanho de bit. Por exemplo, 6 dígitos fornecem um milhão de IDs exclusivos, mas 6 caracteres alfanuméricos (usando o conjunto base64) fornecem 68 bilhões de identificadores exclusivos.

Pelo que sabemos, os identificadores alfanuméricos podem ser números seqüenciais, apenas codificados em um formato alfanumérico como base64. Mas, geralmente, os serviços comerciais evitam códigos sequenciais para impedir que as pessoas adivinhem os IDs e evitar a divulgação de informações comerciais, como a quantidade de clientes.

JacquesB
fonte
1

Há várias razões pelas quais você usaria IDs não numéricos, mas também entenda que nem todos os valores com caracteres alfabéticos são realmente cadeias de caracteres. O YouTube tem a reputação de um número incrível de vídeos, da ordem de 300 horas de vídeo enviadas a cada minuto ( ref ). Os números inteiros únicos que representam esses vídeos podem ficar muito longos, portanto, use algo como números codificados por URL Base64 ( ref ).

Tipos de representações de identificador:

  • Inteiros simples: (12345, 981027489382493)
  • Inteiros da base 16: 123456789abcdef - também conhecido como Hex
  • Inteiros base 64: 9b6tMZS
  • Seqüências de caracteres legíveis: 12032017-Read-my-awesome-article-01

Todos eles têm seus pontos fortes e fracos. Quanto mais caracteres únicos você puder usar para seus identificadores, menos caracteres precisará 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 compacta o número de caracteres necessários para representar um número de 6 a 8 (ou seja, 3/4 do tamanho).

Sequências legíveis funcionam para blogs porque podem aumentar a capacidade de pesquisa e é muito mais fácil gerar títulos exclusivos quando o número de registros é pequeno.

Berin Loritsch
fonte
1

Hash de conteúdo

A palavra "hash" não é encontrada nas respostas existentes, legais, então vamos lá:

Freqüentemente, os dados podem ser identificados por seu hash de conteúdo em vez de um ID artificial independente. Isso é particularmente evidente em software como gitsistemas de arquivos como o ZFS, onde essa propriedade específica de usar hashes de conteúdo não apenas facilita as coisas (por exemplo, deduplicação), mas também possui outras propriedades interessantes, como cache trivial, histórico seguro, detecção de rotações de bits etc.

Os hashes geralmente vêm como números hexadecimais (ou um espaço para letras ainda maior); é por isso que você não vê IDs inteiros. Simplesmente não há números inteiros (nesses casos).

Hashes são bons se seus objetos de dados são imutáveis ​​(como no ZFS ou git); seria ótimo armazenar imagens, por exemplo, em CDNs grandes. Não sei se esses IDs específicos são realmente hashes, mas certamente faria sentido (e, como Michael Kjörling comentou, IDs curtos provavelmente não são hashes por razões óbvias - como comparação, o git usa valores SHA-1 com 20 bytes ou 40 dígitos hexadecimais).

AnoE
fonte
11
Pelo menos os IDs de vídeo do YouTube são muito curtos para serem hashes. O paradoxo do aniversário se aplica; em resumo, em média, com um espaço de hash de n bits, você começará a ver colisões depois de ver 2 ^ (n / 2) blobs de entrada. Com ~ 60-70 bits no ID, são 30-35 bits de exclusividade, ou alguns bilhões de entradas. Tenho certeza de que eles hospedam mais vídeos do que isso até agora. E, claro, a maioria dos hashes são números inteiros; o fato de que eles normalmente não são impressos na forma decimal não tem influência sobre se são ou não números inteiros. É certo que os mesmos dados provavelmente poderiam ser interpretados como dados binários de ponto flutuante ...
CVn
3
@ MichaelKjörling: Bem, os IDs de vídeo do YouTube são muito curtos para serem hashes criptográficos , mas existem muitas funções de hash com 64 bits de saída ou menos - CRC-16/32/64, Java hashCode(), etc. Claro, quanto mais curto o hash, as colisões aleatórias mais prováveis ​​são.
dan04
Se você quisesse que as pessoas se lembrassem do URL, não o tornaria significativo. E ter que dizer "superior" ou "inferior" na frente de cada letra é muito menos eficiente do que apenas dizer números.
Lenne
0

Ok, uma das razões é que os caracteres são enviados como caracteres e não como números inteiros. Isso ocorre por como um HTTP Get funciona.

Quando você diz "por que não usar um número inteiro?" Bem, o número inteiro é então cortado e todos os dígitos são enviados como um caractere e você acaba com uma sequência de caracteres de qualquer maneira. Então, por que não usar todas as opções para um personagem?

Há também o fator humano:

Veja o imgur, por exemplo: https://imgur.com/ ***** / s6UqP

s6UqP,

O intervalo para cada caractere é: a até z maiúsculo, a até z maiúsculo e 0 a 9 = 26+ 26+ 10 = 62 opções para cada posição 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 armazenar aproximadamente 7 objetos na memória, 9 dígitos é demais, 5 caracteres são factíveis.

Número mágico 7

Pieter B
fonte
Ele lembra Gfycat: eles usam três palavras, dois adjetivos e um nome de animal. Como existem muitas possibilidades ( 1502 adjetivos e 1751 animais ), eles têm mais de 3 bilhões de combinações usando apenas três objetos.
Gustavo Rodrigues