2011-01-01 27 views
20

Nie chodzi tu o skracanie adresów URL, ale i tak mam taki cel, więc zobaczmy to w ten sposób. Oczywiście kroki do skracania adresów URL są:Algorytm skracania adresu URL

  1. Take pełny adres URL
  2. Generowanie unikalnego krótki ciąg być kluczem do adresu URL
  3. przechowywać URL i klucz w bazie danych (a keystone wartościowy sklep idealnie pasuje tutaj)

Teraz, o drugim punkcie. Oto, co wymyśliłem:

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 

Czy to wystarczy?

+0

Z ciekawości, po co zawracać sobie głowę UUID? Dlaczego nie na przykład po prostu wygenerować 5 lub więcej bajtów z instancji losowej? –

+1

Zacząłem od losowego/System.nanoTime/adresu mac mac ', a następnie zdałem sobie sprawę, że uuid ma wszystkie z nich :-) – Bozho

+0

@Bozho możesz rozważyć [kodowanie Base32 aka kodowania Crockford] (http: //www.crockford .com/wrmg/base32.html), ponieważ ma kilka zalet, takich jak usuwanie potencjalnie niejednoznacznych znaków, takich jak 0 i litera L. Otrzymasz dłuższy krótki URL, ale jeśli nie masz miliardów, to może warto. –

Odpowiedz

4

W przypadku aplikacji do przesyłania plików, które napisałem, potrzebowałem również tej funkcji.Po przeczytaniu this SO article, postanowiłem trzymać tylko kilka liczb losowych i sprawdzić, czy istnieją w DB.

Twoje aproach jest podobne do tego, co zrobiłem.

2

Co masz na myśli, mówiąc o skracaniu adresów URL?

Istnieją różne techniki. Większość witryn internetowych, AFAIK, używa tej techniki, aby umieścić klucz podstawowy bazy danych (być może w jakiejś zakodowanej) w adresie URL w miejscu, w którym można go parsować za pomocą wyrażenia regularnego, a po prostu poprawiając pozostałe za pomocą słów kluczowych.

Przykład z Amazon: http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

Można wprowadzić coś w miejsce nazwy produktu, tylko identyfikator na końcu jest ważna.

Możesz jednak zachować czyste łącza i sprawdzić, czy są poprawne, i wykonać 301 przekierowanie na rzeczywisty URL lub umieścić kanoniczny adres URL, jeśli pojawi się zły adres URL.

Jednakże:

Jeśli chcesz zrobić coś takiego TinyURL, moja odpowiedź brzmi: zdecydowanie nie.

To nie wystarczy.

To zależy.

To nie jest "bezpieczne". Łatwo odgadnąć adresy URL. Lepszym rozwiązaniem byłoby użycie funkcji kryptograficznych, takich jak SHA-1/MD5.

Jeśli chodzi o kolizje, nie mogę powiedzieć. Identyfikator GUID został zaprojektowany, aby nie powodować kolizji, ale używasz tylko pierwszych 6 znaków. Nie wiem, co dokładnie reprezentują w algorytmie. Ale zdecydowanie nie jest optymalna.

Dlaczego po prostu nie używasz automatycznego przyrostu klucza bazy danych? Jeśli bezpieczeństwo jest ważne, z pewnością skorzystasz z więcej niż 6 znaków.

nad projektem robiłam kiedyś coś takiego

/bazy danych klucza podstawowego/hash-of-primary-key-z-jakiś-token-lub-client-informacje/

ten sposób Mogłem bezpośrednio wyszukać klucz podstawowy w bazie danych, który był najszybszy z możliwych sposobów, ale także zweryfikować, czy link nie został znaleziony przez brutalny wymuszony przez skrót. W moim przypadku hasz był sumą SHA-1 tajnego tokenu klienta i kluczem podstawowym.

+0

Dlaczego uważasz, że łatwo będzie odgadnąć adresy URL? Nie sądzę. Funkcje mieszania generują większą wydajność niż potrzebuję, więc znowu będę musiał przyciąć. Zakotwiczony klucz podstawowy DB może być w porządku, ale nie jest konieczne, aby baza danych miała do tego opcję. Magazyny klucz-wartość nie mają wartości – Bozho

+0

W przypadku skrótu adresu URL, dlaczego ma znaczenie, czy ktoś może odgadnąć adres URL? Docelowo powinny zostać przekierowane na tę stronę, a dostęp będzie albo publiczny (dla standardowej strony bagna), albo ograniczony innymi sposobami. – Rob

+0

zależy od przypadku użycia @Rob. jeśli tak, to dlaczego w ogóle stosuje się haszowanie, a nie tylko automatyczny przyrost? Chciałem tylko wyjaśnić, że przypadek użycia i wymagania nie są jasne w pytaniu. –