2011-01-01 21 views
20

Ahora bien, esto no se trata estrictamente del acortamiento de URL, pero mi propósito es tal de todos modos, así que vamos a verlo así. Por supuesto, los pasos para el acortamiento de URL son:Algoritmo de acortamiento de URL

  1. Toma la URL completa
  2. generar una cadena corta única para ser la clave para la URL
  3. tienda de la URL y la clave en una base de datos (un número- tienda de valores sería una combinación perfecta aquí)

Ahora, sobre el segundo punto. Esto es lo que se me ocurrió:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
UUID uuid = UUID.randomUUID(); 
dos.writeLong(uuid.getMostSignificantBits()); 
String encoded = new String(Base64.encodeBase64(baos.toByteArray()), "ISO-8859-1"); 
String shortUrlKey = StringUtils.left(encoded, 6); // returns the leftmost 6 characters 
// check if exists in database, repeat until it does not 

¿Es esto lo suficientemente bueno?

+0

Por curiosidad, ¿por qué molestarse con un UUID? ¿Por qué no, por ejemplo, solo generar 5 o más bytes de una instancia aleatoria? –

+1

Comencé con un bit aleatorio/System.nanoTime/the mac address 'y luego me di cuenta de que uuid tiene todo esto :-) – Bozho

+0

@Bozho es posible que desee considerar [codificación Base32 aka codificación Crockford] (http: //www.crockford .com/wrmg/base32.html) ya que tiene algunas ventajas, como eliminar caracteres potencialmente ambiguos como 0 y la letra L. Tendrá una URL corta más larga, pero si no tiene miles de millones, puede que valga la pena. –

Respuesta

4

Para una aplicación de carga de archivos que escribí, necesitaba esta funcionalidad también.Después de leer this SO article, decidí seguir con algunos números al azar y comprobar si existen en la base de datos.

Así que su enfoque es similar al que hice.

2

Bueno, ¿qué quiere decir con acortamiento de URL?

Existen técnicas muy diferentes. La mayoría de los sitios web, AFAIK, utilizan la técnica para simplemente colocar la clave primaria del banco de datos (quizás de algún modo codificado) en la URL en alguna posición donde puede analizarse mediante una expresión regular y mejorar el resto con palabras clave.

Ejemplo de Amazon: http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

Puede introducir nada en lugar del nombre del producto, sólo la identificación en el final es importante.

Sin embargo, es posible que desee mantener sus enlaces limpios y comprobar si es correcto y hacer 301 reenviar a la URL real o poner una URL canónica si aparece una URL incorrecta.

Sin embargo:

Si quieres hacer algo como TinyURL, mi respuesta es un no rotundo.

No es lo suficientemente bueno.

Bueno, eso depende.

No es "seguro". Sería bastante fácil adivinar las URL. Un mejor enfoque sería usar alguna función criptográfica como SHA-1/MD5.

Cuando se trata de colisiones realmente no puedo decirlo. GUID fue diseñado para no tener colisiones, pero solo está usando los primeros 6 caracteres. No sé qué representan exactamente en el algoritmo. Pero definitivamente no es óptimo.

¿Por qué, sin embargo, no utiliza la clave primaria de incremento automático de la base de datos? Si la seguridad es importante, también debes ir con más de 6 caracteres.

En un proyecto que hice usé algo así como

/base de datos de clave primaria/hash de-primaria-teclas con-cierto-token-o-cliente-información/

esta manera Pude buscar directamente la clave principal en la base de datos, que era la manera más rápida posible, pero también pude verificar que el enlace no fue encontrado por el bruto forzado por el hash. En mi caso, el hash era la suma SHA-1 del token secreto del cliente y la clave principal.

+0

¿Por qué crees que será fácil adivinar las URL? No lo creo. Las funciones hash producen una producción mayor de la que necesito, así que de nuevo tendré que recortar. Una clave primaria de base de datos hash puede estar bien, pero no es necesario que la base de datos tenga una opción para eso. Los almacenes clave-valor no – Bozho

+0

Para un URL más corto, ¿por qué es importante si alguien puede adivinar una URL? En última instancia, deben ser redirigidos a esa página, y el acceso será público (para una página web estándar de pantano) o restringido por otros medios. – Rob

+0

depende del caso de uso @Rob. si es así, ¿por qué hacer hashing y no solo usar un incremento automático? Solo estaba tratando de aclarar que el caso de uso y los requisitos no están claros en la pregunta. –