Pergunta

Eu tenho alguns dados que vêm regularmente como um despejo de uma souce de dados com uma chave natural de string que é longa (até 60 caracteres) e não é relevante para o usuário final. Estou usando essa chave em um URL. Isso torna os URLs muito longos e o usuário.

Eu gostaria de transformar as teclas de string em números inteiros com os seguintes requisitos:

O conjunto de dados de origem mudará com o tempo.

O ID deve ser:

  • número inteiro não negativo
  • Único e constante, mesmo que o conjunto de chaves de entrada mude
  • De preferência reversível de volta à chave (não é um requisito forte)

O banco de dados é reconstruído a partir do zero, para que não me lembro dos IDs já atribuídos e correspondam ao novo conjunto de dados com IDs existentes e geram IDs seqüenciais para as teclas adicionadas.

Atualmente, existem cerca de 30000 teclas distintas e o conjunto está crescendo constantemente.

Como implementar uma função que mapeará as teclas da string para IDs inteiros?

O que eu pensei:

1. String.gethashcode embutido:

ID(key) = Math.Abs(key.GetHashCode())

  • não é garantido para ser único
  • (não é reversível)

1.1 "Re-houver" o código Gethashcled embutido até que um ID exclusivo seja gerado para evitar colisões.

  • Os IDs existentes podem mudar se algo colidir for adicionado ao início do conjunto de dados de entrada

2. uma função perfeita de hash

  • Não tenho certeza se isso pode gerar IDs constantes se o conjunto de entradas mudar
  • (não é reversível)

3. Traduzir para a base 36/64/??

  • não diminui as teclas longas o suficiente

quais são as outras opções?

Foi útil?

Solução

Você só pode fazer isso se puder manter uma lista de IDs atribuídos.

Para qualquer algoritmo de oferta que realmente oferece um ID exclusivo para o conjunto atual, qualquer novo valor não é garantido para obter um ID exclusivo.

As cordas contêm cerca de 400 bits de informação; portanto, para obter um número inteiro que seja exclusivo, teria que conter todas as informações da string e ter cerca de 400 bits. São 120 caracteres expressos como um número decimal, para que não seja mais curto do que você tem agora.

Outras dicas

Um sha1sum codificado por Base64 tem 27 caracteres. Base64 (MD5 (...)) tem 22 caracteres. Qualquer menor e você terá um risco não negativo de colisões.

Funções perfeitas de hash não são possíveis quando o conjunto de entradas muda.

Configure um segundo banco de dados persistente e guarde seus pares de chave/identificação lá. Certifique-se de ter a data dos dados na tabela para que você possa fazer alguma manutenção de casas.

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