Pregunta

quiero acortar de forma única los identificadores de cadenas en archivos para su uso en URLs como los de bit.ly etc. Puedo utilizar los ID de una base de direcciones URL, pero quiero ser al azar similares.

¿cuál sería la mejor solución?

sitio será un sitio móvil así que quiero que a lo más corto posible

¿Fue útil?

Solución

No se puede "acortar de forma única" cadenas arbitrarias. Encasillar principio y todo.

Lo que se quiere hacer (y, que yo sepa lo que hacen los servicios para acortar URL) es mantener una base de datos de todo lo presentado, y la cadena corta utilizado. A continuación, puede buscarlo en la base de datos.

Puede generar las cadenas cortas simplemente incrementando un número y codificación Base64 por cada vez.

Otros consejos

Existen dos métodos para la implementación de un servicio de mapas como el que usted describe.

  1. Clientes someten los identificadores únicos globales, o
  2. Server genera globalmente identificadores únicos

Los clientes envían los identificadores únicos globales

Por lo que yo sé, 1. Sólo debe intentarse con Guids, a menos que idear un medio similar de meter información suficientemente clara en un flujo de bytes corto. De cualquier manera, si usted tiene un flujo de bytes que representan un identificador único global, puede hacer algo como esto

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

para obtener un mensaje legible de caracteres alfanuméricos que aparece al azar, pero evita las colisiones inherentes a otros esquemas de azar. A Guid contiene 16 bytes, o 128 bits, que se traduce en aproximadamente 19 caracteres para una codificación Base64 completo.

La ventaja de este enfoque es que los clientes pueden generar su propia pequeña Uris sin una autoridad central. La desventaja es la longitud considerable si sacas con Guid, o la aplicación de su propio flujo de bytes único a nivel mundial, que - seamos sinceros -. Es propenso a errores

Si lo hace ir a esta ruta, considere Google'ing globalmente únicos flujos de bytes o el tipo. Ah, y estancia lejos de ser aleatoria BYTES , de lo contrario tendrá que construir de resolución de colisiones EN LA PARTE SUPERIOR DE Uri su generador pequeño.

Server genera globalmente identificadores únicos

Una vez más, la principal ventaja de lo anterior es que el cliente de puede generar su Uris a priori . Especialmente útil si usted está a punto de presentar una solicitud de larga ejecución que desea comprobar en. Esto puede no ser particularmente relevante para su situación, y puede proporcionar un valor limitado solamente.

Así que, aparte de eso, un enfoque centrado en el servidor, en el que una sola autoridad genera y reparte IDS puede ser más atractivo. Si esta es la ruta que elija, entonces la única pregunta es cuánto tiempo le gustaría que su Uri?

Suponiendo que una longitud deseada de 5 caracteres, y digamos que vaya con una codificación Base64, cada ID puede representar hasta 5 caracteres por 7 bits por carácter es igual a 35 bits o 2 ^ 35 [34 359 738 368] valores distintos. Eso es un dominio bastante grande. *

A continuación, se convierte en una cuestión de devolver un valor para una determinada petición. Probablemente hay una gran cantidad de muchas maneras de hacer esto, pero me gustaría ir con algo como esto,

  • Enumerar todos los valores posibles dentro de una "lista libre" en su base de datos
  • Eliminar el valor de la lista libre cuando se consume
  • Añadir valor a la lista libre cuando se libera

Mejoras u optimizaciones pueden incluir

  • No enumerar todos los valores en el rango [0, 2 ^ 35], en lugar de enumerar un subconjunto manejable, digamos 100 000 valores a la vez, y cuando se consumen todos los valores, sólo tiene que generar otros 100 000 valores en secuencia y continuar
  • Añadir una fecha de caducidad a los valores, y reciclar los valores finales espirado del día
  • Distribuir su servicio, cuando la paralelización de su servicio simplemente repartir pequeños subconjuntos mutuamente excluyentes de su lista gratuito a los servicios distribuidos

Conclusión

El fondo es, que quieren garantizar la unicidad - por lo que las colisiones son un gran no-no

.

* = 34 359 738 368 es el tamaño del dominio prima, esto es todos los identificadores de 0 a 5 longitud longitud. Si usted está interesado en la restricción de todos los identificadores a un mínimo y un máximo de 5 longitud, entonces su dominio se parece a todos los identificadores de longitud de 0 a 5 (2 ^ 35) menos todos los identificadores de longitud 0 a 4 (2 ^ 28) es de 2 ^ 35-2 ^ 28 = 34 091 302 912, que todavía es bastante grande:)

almacenar una cadena alfanumérica aleatoria y el uso que para su URL corta. que sea la longitud que usted piensa que es mejor para su sitio y sus usuarios algo como www.yoursite.com/d8f3

Se puede usar un hash (por ejemplo CRC32) para producir URL bastante cortos. Usted nunca será capaz de obtener las direcciones URL 'únicos' como son la reducción de los datos, por lo que no tiene que ser colisiones.

Hola LLN, como varias otras personas con las que ha contado .. Si empieza a comprimir la url en algo pequeño que será imposible para que usted mantenga único. Dicho esto, usted necesita para hacer su propia codificación para cada URL enviado a usted. Una forma (fácil) para hacerlo es, tratar de crear una base de datos de las direcciones URL presentadas y luego generar un campo GUID para cada uno y luego obtener una subcadena de ella asegurando que cada vez que se registra algo es totalmente diferente de la anterior.

Por ejemplo: www.google.com con el GUID F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 -> http://www.mysite.com/?q=CEB2

A medida que más caracteres cuando se utiliza, más cantidad de enlaces puede realizar un seguimiento de. para esta muestra tendrá 65.536 enlaces diferentes (con sólo 4 caracteres en hexadecimal).

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top