Pisze Gadu-Gadu SDK pod PHP i dla jego potrzeb przetłumaczyłem m/w kod hashujący. Coś nie gra a mianowicie na delphi'm po wywołaniu funkcji z parametrami password "pieter6" i seed "2" otrzymuje liczbe "1168318011" natomiast na moim kodzie otrzymuje "1548204827". Kod w PHP powinien wyjść taki sam jak w delphi'm lecz nie jest :/ Moglibyście poprawić ten z PHP?
Mój kod:
function gg_login_hash($password, $seed)
{
$y = $seed;
$x = 0;
for ($i = 1; $i < strlen($password); $i++) {
$x = ($x & 0xFFFFFF00) | ord($password[$i]);
$y = $y ^ $x;
$y = $y + $x;
$x = $x << 8;
$y = $y ^ $x;
$x = $x << 8;
$y = $y - $x;
$x = $x << 8;
$y = $y ^ $x;
$z = $y & 0x1F;
$y = ($y << $z) | ($y >> (32 - $z));
}
return $y;
}
Tłumaczyłem ją na podstawie tych funkcji delphi:
function gg_login_hash(haslo: string; klucz: integer):integer;
var
x, y, z, i :Integer;
begin
y := klucz;
x := 0;
for i := 1 to length(haslo) do
begin
x := (x and $ffffff00) or ord(haslo[i]);
y := y xor x;
y := y + x;
x := x shl 8;
y := y xor x;
x := x shl 8;
y := y - x;
x := x shl 8;
y := y xor x;
z := y and $1F;
y := (y shl z ) or (y shr (32-z));
end;
result :=y;
end;
I z tego c++:
int gg_login_hash(unsigned char *password, unsigned int seed)
{
unsigned int x, y, z;
y = seed;
for (x = 0; *password; password++) {
x = (x & 0xffffff00) | *password;
y ^= x;
y += x;
x <<= 8;
y ^= x;
x <<= 8;
y -= x;
x <<= 8;
y ^= x;
z = y & 0x1f;
y = (y << z) | (y >> (32 - z));
}
return y;
}
Pomocy! Please...
P.S. Aha! A jak w php można zrobić pakiety takie jak w delphi'm record'y? np.
TGG_Header = record
type: integer;
length: integer;
end;