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
imagens 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?
database
database-design
web-services
Rakori
fonte
fonte
Respostas:
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.
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.
fonte
2^40
itens, em algumas arquiteturas existem razões legítimas para escolher um espaço2^80
ou2^120
bits. 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.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.
fonte
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.
fonte
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 usaryoutu.be/23489234892348234933
ouyoutu.be/B9k6KMrv8vh
?2) Por que IDs não sequenciais são usados?
A resposta do IMil explica bem:
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.
fonte
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 IDComo 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.
fonte
Como você apontou que seria fácil de usar um ID único universal usando apenas números, porque sob o capô tudo é apenas
0
e1
e 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,773
letras, é muito mais curtoFu837t
(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.fonte
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.
fonte
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:
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.
fonte
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
git
sistemas 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).fonte
hashCode()
, etc. Claro, quanto mais curto o hash, as colisões aleatórias mais prováveis são.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
fonte