Алгоритм генерации контрольной суммы для url

Discussion in 'PHP' started by erihtoney, 24 Jul 2010.

  1. erihtoney

    erihtoney Member

    Joined:
    3 Mar 2009
    Messages:
    91
    Likes Received:
    73
    Reputations:
    20
    Добрый день.

    Не могу понять связь между контрольной суммой и url при передаче данных к гугл.
    Вернее как она определяется.
    Надеюсь на вашу помощь.
    Буду благодарен за любую подсказку.
     
  2. Qws

    Qws Elder - Старейшина

    Joined:
    17 Jun 2008
    Messages:
    46
    Likes Received:
    57
    Reputations:
    5
    Это самому гуглу известно)))
     
  3. erihtoney

    erihtoney Member

    Joined:
    3 Mar 2009
    Messages:
    91
    Likes Received:
    73
    Reputations:
    20
    Ошибаешься, друг.
    Не только гуглу это известно.
    Сервисов живых еще куча.
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Могли бы погуглить что ль. Например тут: http://www.haneng.com/asp-forum/Google-Checksum-calculator_10629.html
     
    _________________________
  5. erihtoney

    erihtoney Member

    Joined:
    3 Mar 2009
    Messages:
    91
    Likes Received:
    73
    Reputations:
    20
    На дату посмотрите.
    Эти алгоритмы давно уже не работают.
    Вообщем, пришел в выводу, необходимо разбирать тулбар гугла.
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Хм, да, мой косяк, и только из-за этого я погуглил еще раз. Вот рабочий вариант. Тут: http://pastebin.com/Mhfz45tq Или тут:
    PHP:
        function GooglePageRank($url){
        
    $arr parse_url($url);
        
    $url $arr['host'];
        
    $url="info:".$url$ch=GoogleCSum($url,0xE6359A60);
        
    $host="toolbarqueries.google.com"$hostip=gethostbyname($host);
        
    $query ="GET /search?client=navclient-auto&ch=6".$ch."&ie=UTF-8&oe=UTF-8&features=Rank&q=".rawurlencode($url)." HTTP/1.0\r\n";
        
    $query.="Host: $host\r\n"$rank=-1;
        
    $query.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
        
    $query.="Connection: Close\r\n\r\n";
        
    $fp=fsockopen($hostip,80,$errno,$errstr,30);
        if (
    $fp)
        { 
    fputs($fp,$query); $data=""; while (!feof($fp)) $data.=fgets($fp,4096); fclose($fp);
        
    $data=explode("\n",$data);
        foreach (
    $data as $line)
        if (!
    is_bool(strpos($line,"Rank_1")))
        { 
    $rank=explode(":",trim($line)); $rank=$rank[2]; break; } }
        return 
    $rank;
        }

        function 
    GoogleCSum($s,$key){
        
    $v4=$len=strlen($s); $esi=$key$ebx=$edi=0X9E3779B9$p=0;
        if (
    $len>=12)
        for(
    $i=0;$i<floor($len/12);$i++)
        { 
    $edi=unsign($edi+ord($s[$p+4])+(ord($s[$p+5]) << 8)+(ord($s[$p+6]) << 16)+(ord($s[$p+7]) << 24));
        
    $esi=unsign($esi+ord($s[$p+8])+(ord($s[$p+9]) << 8)+(ord($s[$p+10]) << 16)+(ord($s[$p+11]) << 24));
        
    $edx=unsign(($ebx+ord($s[$p+0])+(ord($s[$p+1]) << 8)+(ord($s[$p+2]) << 16)+(ord($s[$p+3]) << 24)-$edi-$esi)^shr($esi,13));
        
    $edi=unsign(($edi-$esi-$edx)^($edx << 8));
        
    $esi=unsign(($esi-$edx-$edi)^shr($edi,13));
        
    $edx=unsign(($edx-$edi-$esi)^shr($esi,12));
        
    $edi=unsign(($edi-$esi-$edx)^($edx << 16));
        
    $esi=unsign(($esi-$edx-$edi)^shr($edi,5));
        
    $edx=unsign(($edx-$edi-$esi)^shr($esi,3)); $ebx=$edx;
        
    $edi=unsign(($edi-$esi-$ebx)^($ebx << 10));
        
    $esi=unsign(($esi-$ebx-$edi)^shr($edi,15));
        
    $v4-=12$p+=12; }
        
    $esi=unsign($esi+$len);
        if (
    $v4>=11$esi=unsign($esi+(ord($s[$p+10]) << 24));
        if (
    $v4>=10$esi=unsign($esi+(ord($s[$p+9]) << 16));
        if (
    $v4>=9$esi=unsign($esi+(ord($s[$p+8]) << 8));
        if (
    $v4>=8$edi=unsign($edi+ord($s[$p+4])+(ord($s[$p+5]) << 8)+(ord($s[$p+6]) << 16)+(ord($s[$p+7]) << 24));
        else
        { if (
    $v4>=7$edi=unsign($edi+(ord($s[$p+6]) << 16));
        if (
    $v4>=6$edi=unsign($edi+(ord($s[$p+5]) << 8));
        if (
    $v4>=5$edi=unsign($edi+ord($s[$p+4])); }
        if (
    $v4>=4$ebx=unsign($ebx+ord($s[$p+0])+(ord($s[$p+1]) << 8)+(ord($s[$p+2]) << 16)+(ord($s[$p+3]) << 24));
        else
        { if (
    $v4>=3$ebx=unsign($ebx+(ord($s[$p+2]) << 16));
        if (
    $v4>=2$ebx=unsign($ebx+(ord($s[$p+1]) << 8));
        if (
    $v4>=1$ebx=unsign($ebx+ord($s[$p+0])); }
        
    $ebx=unsign(($ebx-$edi-$esi)^shr($esi,13));
        
    $edi=unsign(($edi-$esi-$ebx)^($ebx << 8));
        
    $esi=unsign(($esi-$ebx-$edi)^shr($edi,13));
        
    $ebx=unsign(($ebx-$edi-$esi)^shr($esi,12));
        
    $edi=unsign(($edi-$esi-$ebx)^($ebx << 16));
        
    $esi=unsign(($esi-$ebx-$edi)^shr($edi,5));
        
    $ebx=unsign(($ebx-$edi-$esi)^shr($esi,3));
        
    $edi=unsign(($edi-$esi-$ebx)^($ebx << 10));
        
    $esi=unsign(($esi-$ebx-$edi)^shr($edi,15)); return $esi;
        }
        function 
    shr($x,$y) {
        
    $x=unsign($x);
        for(
    $i=0;$i<$y;$i++) $x=floor($x/2); return $x;
        }
        function 
    unsign($l) {
        
    $l=intval($l);
        if (
    $l>=0){
        return 
    $l;
        }else{
        return 
    4294967296+$l;
        }
        }
    echo 
    GooglePageRank('http://yandex.ru');
     
    _________________________
    #6 Gifts, 24 Jul 2010
    Last edited: 24 Jul 2010
    1 person likes this.
  7. erihtoney

    erihtoney Member

    Joined:
    3 Mar 2009
    Messages:
    91
    Likes Received:
    73
    Reputations:
    20
    Gifts, где вы нашли это чудо?)
    Второй день атакую гугл запросами, ничего не находил.
    Спасибо. Искренне благодарен.