Autor Zpráva
dErOiN
Profil *
Zdravím,

funkce udb_hash je v PAWN ( jazyk pro gta samp ) zahashování ...pry adler32 jenze mi to vzdy ukaze jinou hodnotu...
v PHP mam tu funkci takto :
=============================================
function _udbhash( $pass )
{
    $length = strlen($pass);
    $s1 = 1;
    $s2 = 0;
    
    for($i=0; $i<$length; $i++)
    {
      $s1 = ($s1 + $pass[$i]) % 65521;
      $s2 = ($s2 + $s1)       % 65521;
    }
    return ($s2 << 16) + $s1;   
}
=============================================
v PAWN vypadá takto
=============================================
stock udb_hash(buf[]) {
    new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n<length; n++)
    {
       s1 = (s1 + buf[n]) % 65521;
       s2 = (s2 + s1)     % 65521;
    }
    return (s2 << 16) + s1;
}



poraďte někdo prosím, spěchá :(

Moderátor Joker: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Majkl578
Profil
Pokud je to adler32, proč nepoužiješ funkci hash?
hash('adler32', 'something');


Co se přepsání toho kódu týče:
Myslím si, že by jsi měl převést znak na jeho ASCII hodnotu (řádek 8 v [#1]).
Vrácená hodnota z předchozího kódu je v hexadecimální podobě.

function udbHash($pass)
{
    $a = 1;
    $b = 0;
    
    for($i = 0, $len = strlen($pass); $i < $len; $i++) {
      $a = ($a + ord($pass[$i])) % 65521;
      $b = ($a + $b) % 65521;
    }
    return dechex(($b << 16) + $a);
}

Toto by tedy měl být ekvivalent.
echo dechex(udbHash('blah')); //3fa0198
echo '<br>';
echo hash('adler32', 'blah'); //03fa0198

Nevím, jestli je problém ta nula na začátku, ale není problém si ji případně upravit změnou
return dechex(($b << 16) + $a);

na
return '0' . dechex(($b << 16) + $a);


Ale myslím si, že použití přímo funkce hash() bude praktičtější.
dErOiN
Profil *
neres adler32.....na serveru ( v gta ) mi tato funkce

stock udb_hash(buf[]) {
    new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n<length; n++)
    {
       s1 = (s1 + buf[n]) % 65521;
       s2 = (s2 + s1)     % 65521;
    }
    return (s2 << 16) + s1;
}



da hodnotu jinou, nez ta funkce v php ...o to se mi jedna ..
treba ve hre to udela z hesla 'necum' : 104792601
a tim php mi to udela z hesla 'necum' : 327681

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Davex
Profil
Majkl578 má pravdu, chyba je na řádku č. 8:

      $s1 = ($s1 + ord($pass[$i])) % 65521;
Majkl578
Profil
dErOiN:
da hodnotu jinou, nez ta funkce v php ...o to se mi jedna ..
treba ve hre to udela z hesla 'necum' : 104792601
a tim php mi to udela z hesla 'necum' : 327681
Jo? Mně to teda v PHP vrátí to samé (v desítkové podobě, tedy bez použití dechex).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: