2010-01-12 16 views
6

quiero acortar de manera única ids de archivo de cadenas para usar en direcciones URL como las de bit.ly etc. Puedo usar ids desde un DB pero quiero que las URL sean aleatorias.cadena de acortamiento C# para url

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

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

+0

¿Desea que los suyos utilicen el servicio bit.ly? ¿O tienes que implementar tu personalizado? – keyboardP

+0

esto es para mi propio sitio y no es un servicio de acortamiento de URL, sino para crear urls cortas únicas para los archivos – nLL

+2

La razón por la que pregunté, era porque se podía usar el bit.ly api: http://www.emadibrahim.com/ 2009/05/07/shortening-urls-with-bitlys-api-in-net/ – keyboardP

Respuesta

6

No se puede "acortar de forma única" cadenas arbitrarias. Principio de casillero y todo.

Lo que quiere hacer (y, AFAIK qué servicios de acortamiento de URL lo hacen) es mantener una base de datos de todo lo enviado, y la cadena corta utilizada. Luego puede buscarlo en la base de datos.

Puede generar las cadenas cortas simplemente incrementando un número y Base64 codificándolo para cada vez.

+0

pensé en eso, pero no sería un poco caro desde el punto de consulta db – nLL

+8

Esto es para lo que están diseñadas las bases de datos. –

+0

+1 incremento y Base64 enc. Eso parece ser exactamente lo que el OP está pidiendo. –

0

almacena una cadena alfa-numérica aleatoria y úsala para tu url corta. haga que sea la longitud que crea que es mejor para su sitio y sus usuarios algo así como www.yoursite.com/d8f3

+0

oi, no me gusta distribuir -1, pero el truncamiento Guid tiene uno , por lo que los bytes aleatorios también tienen uno. tal vez si agrega el "escribir un controlador de colisión", podría retractarme, pero abogar por valores aleatorios en lugar de valores únicos es simplemente incorrecto :( –

+2

Dije ALMACENARLO. Durante su proceso de almacenamiento puede verificar que es único antes de colocarlos en su base de datos como único. Supongo que es mi culpa por suponer que él no es lo suficientemente estúpido como para no escribir un controlador de colisiones. – RHicke

0

Puede usar un hash (por ejemplo, CRC32) para producir URL bastante cortas. Nunca podrá obtener URL únicas mientras reduce los datos, por lo que tiene que haber colisiones.

5

Existen dos métodos para implementar un servicio de mapas como el que usted describe.

  1. Los clientes envían los identificadores únicos globales, o
  2. servidor genera globalmente identificadores únicos

clientes enviar los identificadores únicos globales

Por lo que yo sé, 1. Sólo se debe intentar con Guid s, a menos que conciba un medio similar para meter información suficientemente distinta en un flujo de bytes cortos. De cualquier manera, si usted tiene un flujo de bytes que representan un identificador único global, que 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 aparecen al azar, pero evita las colisiones inherentes a otro al azar esquemas. Un Guid contiene 16 bytes, o 128 bits, que se traduce en aproximadamente 19 caracteres para una codificación Base64 completa.

La ventaja de este enfoque es que los clientes pueden generar sus propios Uris pequeños sin una autoridad central. La desventaja es una gran longitud si tira con Guid, o implementa su propia corriente de bytes globalmente única que, admitámoslo, es propensa a errores.

Si sigue esta ruta, considere la posibilidad de hacer búsquedas en Google de bytes de bytes únicos o similares. Ah, y MANTENTE ALEJADO DE BYTES ALEATORIOS, de lo contrario tendrá que construir la resolución de colisión EN LA PARTE SUPERIOR DE su pequeño generador Uri.

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 está por enviar una solicitud de larga ejecución que desea verificar. Esto puede no ser particularmente relevante para su situación, y puede proporcionar solo un valor limitado.

Por lo tanto, 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 eliges, entonces la única pregunta es ¿cuánto tiempo te gustaría tener tu Uri?

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

Luego se trata de devolver un valor para un envío determinado. 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
  • valor Eliminar de la lista libre cuando se consume
  • agregar 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
  • Agregar 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

En pocas palabras, quieres guara ntee uniqueness - 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 está interesado en restringir todos los identificadores a un mínimo y un máximo de 5, su dominio se parece a todos los identificadores de longitud 0 a 5 (2^35) menos todos los identificadores de longitud 0 a 4 (2^28) son 2^35 - 2^28 = 34 091 302 912, que todavía es bastante grande :)

-2

Hola, como muchas otras personas te han dicho ... Si comienzas a comprimir la URL en algo pequeño, será imposible para ti mantenerlo único. Dicho esto, debe crear su propia codificación para cada url que se le presente. Una manera (fácil) de hacerlo es intentar crear una base de datos a partir de las direcciones URL enviadas y luego generar un campo guía para cada una de ellas y luego obtener una subcadena que asegure que cada vez que registre algo sea 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 usa, más cantidad de enlaces puede seguir. para esta muestra, tendrá 65536 enlaces diferentes (con solo 4 caracteres en hexadecimal).

Espero que esto ayude.

+1

lo siento, -1 por truncar las guías. Sólo mala práctica pobre. está garantizado que es único. Tomar cualquier porción o subconjunto de un Guid no lo es. Cuenta todos los bits. –

+0

Conozco a Johnny, y no puedes encontrar en ninguna de mis publicaciones una referencia en la que diga un subconjunto de el enlace es único ... – rodrigoelp

Cuestiones relacionadas