![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 2 Dołączył: 18.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam, zastanawiam się nad generowaniem unikalnego identyfikatora o jak najkrótszym łańcuchu znaków. Szukałem na forum i nie znalazłem odpowiedniego tematu. Moją uwage zwróciło kilka funkcji.
CRC32 ADLER32 uniqid() (funkcja w php) Nie chodzi tu o szyfrowanie haseł, a o budowanie krótkich linków czy krótkich nazw plików. Która funkcje byście polecali? PS Swoja droga ciekawe jakie jest prawdopodobieństwo kolizji. Myślę, że do takich zastosowań jak nazwy plików się nada ![]() Ten post edytował Sekwer 12.05.2010, 19:26:25 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 309 Pomógł: 20 Dołączył: 13.02.2010 Skąd: Kęty Ostrzeżenie: (0%) ![]() ![]() |
MD5 masz długie, albo SHA
-------------------- Fotografia, projektowanie stron WWW | web-coding.pl - HTML 5 i CSS 3 - już w krótce ;)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 2 Dołączył: 18.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Znam te funkcje skrótu. Bardziej chodzi mi o wygenerowanie jak najkrótszego identyfikatora. 8 znaków to co udało mi się uzyskać i chyba jak na razie to wszystko.
8 znaków jako liczba heksdecymalna ![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym skorzystał mimo wszystko z md5, tylko wyciął z niego np. losowo 8 znaków.
I zabezpieczyłbym się przed kolizjami, np. tak (jeżeli chodzi o unikalne nazwy plików, analogicznie możesz zrobić np. wyszukiwanie po hashu z bazy danych):
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 2 Dołączył: 18.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym skorzystał mimo wszystko z md5, tylko wyciął z niego np. losowo 8 znaków. I zabezpieczyłbym się przed kolizjami, np. tak (jeżeli chodzi o unikalne nazwy plików, analogicznie możesz zrobić np. wyszukiwanie po hashu z bazy danych):
Twoje rozwiązanie nie jest profesjonalne. BTW Po co mam robić dodatkowe zapytanie do bazy o klucz? Moje rozwiązanie musi działać bez bazy, ponieważ raz mogę mieć bazę w projekcie a raz nie. Wydaje mi się, ze nie da się zejść poniżej 8 znaków, mówią to proste obliczenia matematyczne jeżeli haszem jest liczba heksadecymalna. Pozdrawiam ![]() PS Łatwo chyba zapamiętać 8 znaków ![]() Ten post edytował Sekwer 14.05.2010, 14:01:25 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Albo ni w pytkę nie wiem o co ci chodzi, albo nie umiesz czytać ze zrozumieniem. Chyba to drugie.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 2 Dołączył: 18.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Skoro nie zastanawiasz się nad tym co piszesz to już twój problem.
Nie można wybierać losowych znaków z innego hasha md5 bo jest duże prawdopodobieństwo kolizji. Naucz się podstaw PHP i kryptografii i dopiero się wypowiadaj. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Ty się naucz lepiej praktycznego podejścia do sprawy, panie "liczba heksdecymalna".
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Dość.
Jakiekolwiek przepychanki w tym temacie i polecą warny. -------------------- ![]() 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: 511 Pomógł: 143 Dołączył: 13.03.2010 Skąd: Jasło Ostrzeżenie: (0%) ![]() ![]() |
wg mnie hasz nie służy do tego by generować unikalne kody w takim sensie jak Ty to opisujesz. Zastosowaniem hasza są funkcje skrótu, potwierdzanie autentyczności danych itd.
Powiedzmy że mamy hasz: xxxx gdzie x to znaki z zakresu [0-9], masz wtedy 10000 możliwych kodów. W przypadku md5 jest to 16^32 = 3.40282367 × 10^38 (ponieważ md5 to znaki z zakresu [0-9,a-f]), jest to ileś tam razy więcej możliwości więc prawdopodobieństwo powtórzenia w md5 jest znikome dzięki temu. Chodzi mi o to że na x znakach możesz mieć skończoną liczbę możliwości. proponuję byś pocztytał manual php, dokładnie: http://www.php.net/manual/en/function.base-convert.php#52450, zapoznał się z różnymi pomysłami i wybrał. Ja to robię tak, dodaje te zdjęcia/linki do bazy danych, robię klucz główny z AI potem używam funkcji do której podałem linka na id np. na dwóch znakach mam 3844(62^2) możliwości, na 3 znakach już 238 328 (62^3) itd. Alfabet w tym przypadku to: [0-9,a-z,A-Z], więc przyjemny myślę ![]() Obrazowy przykład: Kod <?php
function dec2any( $num, $base=62, $index=false ) { if (! $base ) { $base = strlen( $index ); } else if (! $index ) { $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base ); } $out = ""; for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) { $a = floor( $num / pow( $base, $t ) ); $out = $out . substr( $index, $a, 1 ); $num = $num - ( $a * pow( $base, $t ) ); } return $out; } function any2dec( $num, $base=62, $index=false ) { if (! $base ) { $base = strlen( $index ); } else if (! $index ) { $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 0, $base ); } $out = 0; $len = strlen( $num ) - 1; for ( $t = 0; $t <= $len; $t++ ) { $out = $out + strpos( $index, substr( $num, $t, 1 ) ) * pow( $base, $len - $t ); } return $out; } /*for ($i=1; $i<62*62+5; ++$i) { echo dec2any($i); echo"<BR>"; }*/ $test = 3844; echo dec2any($test); echo "<br>"; echo any2dec(dec2any($test)); ?> Ten post edytował jaslanin 15.05.2010, 12:26:15 -------------------- Good luck and happy PHP'ing
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 2 Dołączył: 18.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
@jaslanin dzięki za wyczerpujący post
Ty się naucz lepiej praktycznego podejścia do sprawy, panie "liczba heksdecymalna". @croc "heksdecymalna" to literówka w poście #5 jest napisane liczba heksadecymalna panie "pytka" Obok sumy kontrolnej funkcje skrótu mają fajne zastosowanie jako identyfikator. Nie ma idealnego rozwiązania, bo każde ma jakieś ograniczenia. Ten post edytował Sekwer 16.05.2010, 10:07:00 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 02:05 |