Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Funkcje haszujace i unikalny identyfikator
Sekwer
post
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
jaslanin
post
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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 07:49