![]() |
![]() |
![]()
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 (IMG:style_emoticons/default/smile.gif) Ten post edytował Sekwer 12.05.2010, 19:26:25 |
|
|
![]() |
![]()
Post
#2
|
|
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ę (IMG:style_emoticons/default/smile.gif) 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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 07:49 |