2011-01-01 12 views
20

Ora, questo non riguarda strettamente l'accorciamento dell'URL, ma il mio scopo è tale comunque, quindi vediamolo in questo modo. Naturalmente i gradini accorciamento URL sono:Algoritmo di accorciamento URL

  1. Prendere l'URL completo
  2. generare una stringa breve unica di essere la chiave per l'URL
  3. Conservare l'URL e la chiave in un database (un chiave- value store sarebbe una corrispondenza perfetta qui)

Ora, circa il secondo punto. Ecco cosa mi è venuto in mente:

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 

È abbastanza buono?

+0

Per curiosità, perché preoccuparsi di un UUID? Perché, per esempio, non generare solo 5 o più byte da un'istanza Random? –

+1

Ho iniziato con un bit casuale/System.nanoTime/l'indirizzo mac 'bit poi ho capito che uuid ha tutto questo :-) – Bozho

+0

@Bozho potresti prendere in considerazione [codifica Base32 aka Crockford encoding] (http: //www.crockford .com/wrmg/base32.html) in quanto presenta alcuni vantaggi come la rimozione di caratteri potenzialmente ambigui come 0 e la lettera L. Avrete un URL breve più lungo, ma se non avete miliardi, forse ne vale la pena. –

risposta

4

Per un'applicazione di caricamento file che ho scritto, avevo bisogno anche di questa funzionalità.Dopo aver letto this SO article, ho deciso di limitarmi a qualche numero casuale e verificare se esistono nel DB.

Quindi il tuo aproach è simile a quello che ho fatto.

2

Beh, cosa intendi per abbreviazione URL?

Ci sono tecniche molto diverse. La maggior parte dei siti Web, AFAIK, utilizza la tecnica per inserire la chiave primaria del databse (magari in qualche codifica) nell'URL in una posizione in cui può essere analizzata da un'espressione regolare e semplicemente aumentando il resto con le parole chiave.

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

È possibile inserire qualsiasi cosa al posto del nome del prodotto, solo l'ID alla fine è importante.

Tuttavia, è possibile mantenere i collegamenti puliti e verificare se sono corretti e effettuare 301 inoltro all'URL reale o inserire un URL canonico se viene visualizzato un URL errato.

Tuttavia:

Se si vuole fare qualcosa di simile TinyURL, la mia risposta è un no definitivo.

Non è abbastanza buono.

Beh, dipende.

Non è "sicuro". Sarebbe abbastanza facile indovinare gli URL. Un approccio migliore sarebbe utilizzare alcune funzioni crittografiche come SHA-1/MD5.

Quando si tratta di collisioni non posso davvero dirlo. Il GUID è stato progettato per non avere collisioni, ma si stanno utilizzando solo i primi 6 caratteri. Non so cosa rappresentino esattamente nell'algoritmo. Ma sicuramente non è ottimale.

Perché, tuttavia, non si utilizza semplicemente la chiave primaria con incremento automatico del database? Se la sicurezza è importante, devi anche andare con più di 6 caratteri.

su un progetto che ho fatto ho usato qualcosa come

/banca dati-chiave primaria/hash-di-chiave primaria-con-qualche--o-client-informazioni sul token/

In questo modo Potrei cercare direttamente la chiave primaria nel database che era il modo più veloce possibile, ma anche verificare che il link non sia stato scoperto da un bruto forzato dall'hash. Nel mio caso l'hash era la somma SHA-1 del token segreto del client e la chiave primaria.

+0

Perché pensi che sia facile indovinare gli URL? Io non la penso così Le funzioni di hash producono un output più grande di quello che mi serve, quindi dovrei ancora tagliare. Una chiave primaria DB hash può essere soddisfacente, ma non è necessario che il database abbia un'opzione per questo. Gli archivi a valore-chiave non sono – Bozho

+0

Per un URL shorterner, perché è importante se qualcuno può indovinare un URL? In definitiva, dovrebbero essere reindirizzati a quella pagina e l'accesso sarà pubblico (per una pagina Web standard della palude) o limitato da altri mezzi. – Rob

+0

dipende dal caso d'uso @Rob. se è così, perché fare un po 'di hashing e non usare solo un incremento automatico? Stavo solo cercando di chiarire che il caso d'uso e i requisiti non sono chiari nella domanda. –