![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Chciałbym napisać sobie stronę do skracania linków (podobną do Tinyurl.pl), ale nie jestem pewien algorytmu.
Weźmy taki adres: http://adres.com/index.php?v=1111111111111...222222222222222 Tinyurl zamienia go na: http://www.tinyurl.pl?pPGv05sf, tak na prawdę na pPGv05sf bo http://www.tinyurl.pl? jest stałe w każdym zamienionym adresie. Domyślam się, że w bazie mam tabele z dwoma kolumnami: pełny adres i skrócony adres. Pytanie jest jak skrócić adres, żeby skrót pozostał unikalny? md5 i sha1 są za długie. Ale połowa z md5 to właśnie 8 czyli tyle ile jest w Tinyurl. Czy wystarczy wygenerować dla adresu sumę md5 i wybrać z niej pierwszą połowę znaków? Co jeśli połowy sum dwóch różnych adresów będą takie same? Sprawdzać w tabeli i ewentualnie dodawać kolejne znaki z sumy? Czy warto się pokusić na jeszcze krótsze adresy np 6pierwszych znaków z md5? Może lepiej użyć fragmentu sha1 albo innego rozwiązania? I jeszcze kwestia przekierowania. User podaje adres: http://www.tinyurl.pl?pPGv05sf skrypcik pobiera z bazy pełny url. I trzeba go przekierować, czy header() wystarczy? Chciałbym uniknąć ostrzeżeń w przeglądarkach, że dochodzi do przekierowania. Zależy mi tez na wydajności. Czy to będzie dobrze dobrze działać? Może coś trzeba poprawić? pozdro |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
Najprostsze skracanie to tabela id , url
potem strona.pl?id=id_z_bazy i pobierasz url where id=(int)$_GET['id'] na koniec nawet zwykłe header('location: '.$url); id w bazie oczywiście auto_increment aby zachować unikalność. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
nie musisz haszować pełnego adresu url, możesz sobie wygenerować losowy kod 5 znakowy i przed dodaniem go do bazy sprawdzasz czy taki skrócony link już istnieje, jeśli tak to losujesz jeszcze raz
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat możesz sobie wygenerować losowy kod 5 znakowy Losowy? Wraz ze wzrostem ilości rekordów będziesz miał problem z generowaniem unikalnego identyfikatora, bo może się parę razy powtórzyć. ![]() Co do praktycznego rozwiązania - BIGINT na ID, i aby nie były to długie liczby do przekazania w URL, tworzymy własny system liczbowy, który będzie zawierał - oprócz cyfr - także wielkie i małe litery oraz pewne znaki specjalne, które nie ulegają zamiany na %XX w adresie. Ale jakie to znaki, to odsyłam do odpowiedniego RFC dla URI. Liczbę-ID zamieniamy na ten system liczbowy i voila - wystarczy go przekazywać w linkach. O systemach liczbowych napisano już całkiem sporo; jeśli chodzi o przytoczone przeze mnie rozwiązanie, to YouTube chyba korzysta z takich identyfikatorów. ![]() -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Losowe generowanie identyfikatorów odpada tego jestem pewien.
erix czy mógłbyś napisać coś więcej o tworzeniu takich literowych systemów liczbowych? Albo powiedzieć jak coś więcej o tym znaleźć? RFC dla URI nie mówi mi nic:) pozdro Ten post edytował nowy_pehapowiec 30.04.2010, 18:57:26 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat erix czy mógłbyś napisać coś więcej o tworzeniu takich literowych systemów liczbowych? A co więcej mogę napisać? Przecież to zwykła zamiana z systemu dziesiętnego na inne. Poszukaj w google, to nie gryzie. Coś prawie jak szestnastkowy, tylko ma więcej znaków. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
To nie ma być system liczbowy a literowy i to już dla mnie jest kłopot. A google podaje co najwyżej systemy lotto w odpowiedzi
![]() Czy mógłbyś napisać coś więcej na ten temat? Jak zrobić sobie taki system liczbowoliterowy? pozdro |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 2 Dołączył: 30.04.2010 Skąd: PL Ostrzeżenie: (0%) ![]() ![]() |
Taka szybka implementacja systemu 0,1,2... 9,a,b,c,...,y,z,A,B,...,Y,Z.
Funkcje konwertują z systemu dziesiętnego na ten właśnie powyższy system sześćdziesięciodwójkowy. Linie 2-20 to tylko generowanie tablic. Oczywiście dla wydajności skryptu, trzebaby było te wartości wpisać na stałe, ale mi się po prostu nie chciało tyle pisać.
Ten post edytował Daniel Meger 30.04.2010, 22:13:59 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Tak trochę OT:
Cytat To nie ma być system liczbowy a literowy i to już dla mnie jest kłopot. To jest NADAL system liczbowy, tylko że oprócz cyfr 0-9 masz inne znaki. Nie ma czegoś takiego, jak system literowy. ![]() ![]() Cytat Oczywiście dla wydajności skryptu, trzebaby było te wartości wpisać na stałe, ale mi się po prostu nie chciało tyle pisać. Wystarczyłoby 3x range + array_merge i array_combine. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 2 Dołączył: 30.04.2010 Skąd: PL Ostrzeżenie: (0%) ![]() ![]() |
Czytelniej by być może było, ale czy wydajniej? Podejrzewam (chociaż tego dokładnie nie wiem), że te funkcje i tak opierają się na bardzo podobnych pętlach, stąd moja sugestia o wpisanie całych tablic wprost do kodu (albo poprzez include) - może zbyt eleganckie to nie jest, ale przy skrypcie, który będzie wykonywany bardzo wiele razy w ciągu sekundy, to może być kluczowa sprawa. Ten post edytował Daniel Meger 1.05.2010, 00:40:59 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Sposób wygenerowania tych tablic jest bez znaczenia. Dowolną metodą wygenerujesz je w pomijalnie małym czasie więc nie ma co sobie zaprzątać głowy mikrooptymalizacją.
Jedyną istotną rzeczą jest jakiś komentarz opisujący co fragment generujący je robi. Ten post edytował Crozin 1.05.2010, 07:57:40 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
dzięki za posty
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.07.2025 - 23:23 |