Pergunta

Eu quero reduzir exclusivamente os IDs de arquivos de strings para usar em URLs como os de bit.ly etc. Posso usar IDs de um banco de dados, mas quero que os URLs sejam aleatórios.

Qual seria a melhor solução?

O site será um site móvel, então eu quero o mais curto possível

Foi útil?

Solução

Você não pode "encurtar exclusivamente" as cordas arbitrárias. Princípio do Pombo e tudo.

O que você deseja fazer (e, AFAIK, o que os serviços de curto-URL fazem) é manter um banco de dados de tudo enviado e a string curta usada. Então você pode procurar no banco de dados.

Você pode gerar as cordas curtas simplesmente incrementando um número e base64 que a codifica para cada vez.

Outras dicas

Existem dois métodos para implementar um serviço de mapeamento como o que você descreve.

  1. Os clientes enviam IDs exclusivos globalmente, ou
  2. O servidor gera IDs globalmente únicos

Os clientes enviam IDs globalmente únicos

Tanto quanto eu sei, 1. só deve ser tentado com GuidS, a menos que você concorda um meio semelhante a informações suficientemente distintas em um fluxo de bytes curto. De qualquer maneira, se você tem um fluxo de bytes que representam um identificador globalmente único, você pode fazer algo assim

// source is either a Guid, or some other globally unique byte stream
byte[] bytes = Guid.NewGuid ().ToByteArray ();
string base64String = Convert.ToBase64String (bytes).Trim ("=");

Para obter uma sequência de alfanuméricos legível pelo usuário que parece aleatória, mas evita colisões inerentes a outros esquemas aleatórios. UMA Guid Contém 16 bytes, ou 128 bits, que se traduz em aproximadamente 19 caracteres para uma codificação completa de base64.

A vantagem dessa abordagem é que os clientes podem gerar seus próprios Uris pequenos sem uma autoridade central. A desvantagem é o comprimento pesado se você rolar com Guid, ou implementar seu próprio fluxo de bytes globalmente exclusivo que - vamos ser sinceros - é propenso a erros.

Se você seguir esse caminho, considere fluxos de bytes globalmente exclusivos ou tais. Óh, e Fique longe de bytes aleatórios, caso contrário, você terá que criar resolução de colisão EM CIMA DE Seu minúsculo gerador de Uri.

O servidor gera IDs globalmente únicos

Novamente, a principal vantagem para o exposto é que o cliente pode gerar seus URIs a priori. Particularmente útil se você estiver prestes a enviar uma solicitação de longa execução que deseja verificar. Isso pode não ser particularmente relevante para sua situação e pode fornecer apenas valor limitado.

Portanto, à parte, uma abordagem centrada no servidor, na qual uma única autoridade gera e distribui IDs pode ser mais atraente. Se esse é o caminho que você escolher, a única pergunta é quanto tempo você gostaria do seu URI?

Presumindo um comprimento desejado de 5 caracteres e digamos que você vá com uma codificação Base64, cada ID pode representar até 5 caracteres por 7 bits por caractere é igual a 35 bits ou 2^35 [34 359 738 368] valores distintos. Esse é um domínio bastante grande. *

Então se torna uma questão de retornar um valor para um determinado envio. Provavelmente existem muitas maneiras de fazer isso, mas eu iria com algo assim,

  • Enumere todos os valores possíveis dentro de uma "lista gratuita" em seu banco de dados
  • Remova o valor da lista gratuita quando consumido
  • Adicione valor à lista gratuita quando liberado

Aprimoramentos ou otimizações podem incluir

  • Não enumerar cada valor no intervalo [0, 2^35], em vez disso, enumerará um subconjunto gerenciável, digamos 100.000 valores por vez e, quando todos os valores forem consumidos, basta gerar outros 100.000 valores em sequência e continuar
  • Adicione uma data de validade aos valores e reciclar valores expirados no final do dia
  • Distribua seu serviço, quando paralelamente seu serviço, simplesmente distribua pequenos subconjuntos mutuamente exclusivos da sua lista gratuita para serviços distribuídos

Conclusão

A linha inferior é que você deseja garantir a singularidade - portanto, as colisões são um grande não -não.


*= 34 359 738 368 é o tamanho do domínio bruto, tudo isso é IDS de 0 de comprimento a 5. Se você estiver interessado em restringir todos os IDs a um mínimo e máximo de 5 comprimento, seu domínio se parece com todos os IDs de comprimento 0 a 5 (2^35) menos todos os IDs de comprimento 0 a 4 (2^28) são 2^ 35 - 2^28 = 34 091 302 912, que ainda é bastante grande :)

Armazene uma corda alfa-numérica aleatória e use-a para o seu URL curto. Faça da duração que você acha que é melhor para o seu site e é algo como algo como www.yoursite.com/d8f3

Você pode usar um hash (por exemplo, CRC32) para produzir URLs bastante curtos. Você nunca será capaz de obter URLs 'exclusivos' à medida que você está reduzindo os dados; portanto, deve haver colisões.

Ei, como várias outras pessoas lhe disseram .. se você começar a comprimir o URL em algo pequeno, será impossível para você mantê -lo único. Dito isto, você precisa fazer sua própria codificação para cada URL enviado a você. De uma maneira (fácil) fazer isso, tente criar um banco de dados a partir dos URLs enviados e, em seguida, gerar um campo GUID para cada um e obter uma substring dele, garantindo que toda vez que você registre algo é totalmente diferente do anterior.

Por exemplo: www.google.com com o GUID F9168C5E-CEB2-4FAA-B6BF-329BF39FA1E4-> http://www.mysite.com/?q=CEB2

À medida que mais caracteres você usa, mais uma quantidade de links em que você pode acompanhar. Para esta amostra, você terá 65536 links diferentes (com apenas 4 caracteres no Hex).

Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top