gg_http_hash - jak w php ?

0

Witam :-)
Interesuje mnie przerobienie ponizszej funkcji na kod php :>
Jest mi to niezbedne do kilku operacyjny z protokolem gadu-gadu .
Moglby ktos pomoc ?
Z gory dziekuje

int gg_http_hash(const char *format, ...)
{
	unsigned int a, c, i, j;
	va_list ap;
	int b = -1;

	va_start(ap, format);

	for (j = 0; j < strlen(format); j++) {
		char *arg, buf[16];

		if (format[j] == 'u') {
			snprintf(buf, sizeof(buf), "%d", va_arg(ap, uin_t));
			arg = buf;
		} else {
			if (!(arg = va_arg(ap, char*)))
				arg = "";
		}	

		i = 0;
		while ((c = (unsigned char) arg[i++]) != 0) {
			a = (c ^ b) + (c << 8);
			b = (a >> 24) | (a << 8);
		}
	}

	va_end(ap);

	return (b < 0 ? -b : b);
}

Jesli to cos da to mam ta funkcje napisana w jezyku delphi

function TGGLite.HTTPHashCode (MultiParam: array of string):integer;
  var b,i,j:integer;
  var a,c:longword;
begin

  result:=-1;

  if length(multiparam)=0 then exit;

  b:=-1;

  for i:=low(multiparam) to high(multiparam) do
  begin

   for j:=1 to length(multiparam[i]) do
   begin
     c:=ord(multiparam[i][j]);
     a:=(c xor b) + (c shl 8);
     b:=(a shr 24) or (a shl 8);
   end;

  end;

  if (b < 0) then result:=-b
  else result:=b;

end;
0

na http://gg.wha.la masz skrypt bramki www -> gg - myślę że się przyda

0

tak :-) tyle ze w kazdym z tych skryptow gg.wha.la jak i z anakin.us , nie jest wykorzystywana powyzsza funkcja hashujaca.W skryptach anakina sluzy ona do hashowania hasla na podstawie seeda z sieci gg. A ja potrzebuje funkcje hashujaca niezbedna do rejestracji numeru gg badz zmiany hasla (tablica z haslem i emailem jest kodowana do 1 ciagu cyfr )

0

aha, no to w takim razie to będzie coś w stylu:

function hash_code($pr){
  $b = -1;

  if(empty($pr))
    return false;

  for($i = 0; $i < count($pr); $i ++)
    for($j = 0; $j < strlen($pr[$i]; $j ++){
      $c = ord($pr[$i][$j]);
      $a = ($c ^ $b) + ($c << 8);
      $b = ($a >> 24) | ($a <<  8);
    }

  return abs($b);
}

mogą być problemy z dużymi liczbami

0

Wielkie dzieki !!!!!!

Mam ostatnie pytanie i zabieram sie za testowanie funkcji :

Jak to ponizej bedzie w php ? czy tez mam w php tak deklarowac tablice jak w delphi ? bo ja ja podaje do tej funkcji ktora mi "przelozyles"

var
 tab:array of string;
begin
    SetLength(tab,2); // z tym nie wiem co mam zrobic w php
    tab[0]:=cos;
    tab[1]:=cos1;

sadze ze tak :

$tab = array();
$tab[0] = cos;
$tab[1] = cos1;

Sorki za takie durne pytanka, ale z php dopiero zaczynam i nie wszystkie funkcje jeszcze lapie :-)
Pozdrawiam

0

w php nie musisz przejmować się rozmiarami tablic, same zmieniają swój rozmiar, alokują sobie pamięć itp itd więc tłumaczenie podkomentowanej linijki możesz sobie darować
więc będzie dokładnie tak jak napisałeś

0

nom i niestety nie smgia poprawnie :-(

function hash_code($pr){
  $b = -1;

  if(empty($pr))
    return false;

  for($i = 0; $i < count($pr); $i ++)
    for($j = 0; $j < strlen($pr[$i]); $j ++){
      $c = ord($pr[$i][$j]);
      $a = ($c ^ $b) + ($c << 8);
	  	  echo $a;
echo '<br>';
      $b = ($a >> 24) | ($a <<  8);
    }
if ($b<0) 
	{
	return -$b;
	}
	else
	{
  return ($b);
	}
}

$pr = array();
$pr[0] = 'cos';
$pr[1] = 'cos1';

$code=hash_code($pr);
echo $code;

kod ktory generuje powyzsza funkcja rozni sie od tego z libgadu... tj. zmienna $c po funkcji ord pokazuje dobrze, jednak gdy tutaj
$a = ($c ^ $b) + ($c << 8);
pojawi sie z pr[1] literka "o" to pokazuje liczbe -489263260 a jest calkiem inna 3805704036, i potem od tego miejsca sie juz sypie dla pozostalych liter z tablicy (wartosci rozniace sie od poprawnych).
ALe to pewnie juz wina samego php :-(

0

no pisałem że mogą być problemy z dużymi liczbami
z tym że na każdym serwerze może być różnie
spróbuj z poniższymi funkcjami

//unsigned shift right  
function ushr($a, $b)  
{    
        $z = 0x080000000;
        $a = $a & 0x0FFFFFFFF;
         
        if ($z & $a)  
        {      
            $a = ($a>>1);  
            $a &= (~$z);  
            $a |= 0x040000000;
            $a = ($a>>($b-1));  
        }  
        else  
        {     $a = ($a>>$b);     
        }  
        return $a;  
}  
   
 
 function toInt32(& $x){ 
    $z = hexdec(80000000);
    $y = (int)$x; 

    if($y == -$z && $x < -$z){ 
         $y = (int)((-1)*$x); // this is the hack, make it positive before 
         $y = (-1)*$y; // switch back the sign 
    } 
    $x = $y; 
}  

i zamiast

$a >> 24 dać ushr($a, 24) i po każdej operacji lub może nawet na końcu przywracać stan unsigned np:

toInt32($a);

0

Hej :-)
Jestes moim idolem :P
POszczegolne wartosci w obliczeniach pokazywane sa inaczej niz w funkcjach z delphi badz z c , ale wynik koncowy jest identyczny.
jeszcze raz wielkie dzieki.
Teraz dzieki Tobie mozna w latwy i szybki sposob dodac kilka funkcji do skryptow anakina i tego z gg.wha.la :-)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1