Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pagerank bei Google (https://www.delphipraxis.net/74951-pagerank-bei-google.html)

bronco 11. Aug 2006 17:08


Pagerank bei Google
 
Hallo liebe Leute!

Ich habe da ein Problem bzw eine Frage.
Habe einen php Code der den Pagerank von Google ausliest und anzeigt.
Ich würde nun gerne eine Funktion schreiben die das aus Delphi macht.
Ich bin leider noch ein Delphi Newbee.
Könnt ihr mir einen Link sagen der diese Funktion schon erfüllt oder mir Anregungen oder Tipps geben wie ich das selber ausführen kann (in eine Delphi Funktion umschreiben)?

Ich habe bereits einen "Freeware" Code gefunden (Source Code muss gekauft werden!!) würde aber lieber auf einen freien offenen Code zurück greifen.

Hier der Link dazu
http://www.irnis.net/soft/pagerank/

Anbei der php Code

Code:
<?php
getPR("http://www.google.com");

define('GMAG', 0xE6359A60);

//unsigned shift right
function zeroFill($a, $b)
{
    $z = hexdec(80000000);
        if ($z & $a)
        {
            $a = ($a>>1);
            $a &= (~$z);
            $a |= 0x40000000;
            $a = ($a>>($b-1));
        }
        else
        {
            $a = ($a>>$b);
        }
        return $a;
}


function mix($a,$b,$c) {
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,13));
  $b -= $c; $b -= $a; $b ^= ($a<<8);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,13));
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,12));
  $b -= $c; $b -= $a; $b ^= ($a<<16);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,5));
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,3));
  $b -= $c; $b -= $a; $b ^= ($a<<10);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,15));
 
  return array($a,$b,$c);
}

function GCH($url, $length=null, $init=GMAG) {
    if(is_null($length)) {
        $length = sizeof($url);
    }
    $a = $b = 0x9E3779B9;
    $c = $init;
    $k = 0;
    $len = $length;
    while($len >= 12) {
        $a += ($url[$k+0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
        $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
        $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
        $mix = mix($a,$b,$c);
        $a = $mix[0]; $b = $mix[1]; $c = $mix[2];
        $k += 12;
        $len -= 12;
    }

    $c += $length;
    switch($len)             /* all the case statements fall through */
    {
        case 11: $c+=($url[$k+10]<<24);
        case 10: $c+=($url[$k+9]<<16);
        case 9 : $c+=($url[$k+8]<<8);
          /* the first byte of c is reserved for the length */
        case 8 : $b+=($url[$k+7]<<24);
        case 7 : $b+=($url[$k+6]<<16);
        case 6 : $b+=($url[$k+5]<<8);
        case 5 : $b+=($url[$k+4]);
        case 4 : $a+=($url[$k+3]<<24);
        case 3 : $a+=($url[$k+2]<<16);
        case 2 : $a+=($url[$k+1]<<8);
        case 1 : $a+=($url[$k+0]);
         /* case 0: nothing left to add */
    }
    $mix = mix($a,$b,$c);
    /*-------------------------------------------- report the result */
    return $mix[2];
}

//converts a string into an array of integers containing the numeric value of the char
function strord($string) {
    for($i=0;$i<strlen($string);$i++) {
        $result[$i] = ord($string{$i});
    }
    return $result;
}


function getPR($_url) {
    $url = 'info:'.$_url;
    $ch = GCH(strord($url));
    $url='info:'.urlencode($_url);
    $pr = file("http://www.google.com/search?client=navclient-auto&ch=6$ch&ie=UTF-8&oe=UTF-8&features=Rank&q=$url");
    $pr_str = implode("", $pr);
    return substr($pr_str,strrpos($pr_str, ":")+1);
}

?>

BlueStarHH 11. Aug 2006 18:47

Re: Pagerank bei Google
 
In einer Newsgroup habe ich gerade gelesen, dass es nicht erlaubt ist den Page-Rank so per URL abzufragen. Nur die Google-API-Funktionen dürfen genutzt werden.

bronco 13. Aug 2006 01:11

Re: Pagerank bei Google
 
So habe ein wenig rumgecoded aber es gibt noch ein paar Fragen.
Delphi-Quellcode:
function mix(a, b, c : integer): integer;

 begin
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,13)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 8));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,13)));
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,12)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 16));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,5)));
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,3)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 10));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,15)));

  result := mix(a, b, c);
end;
Wird die Ausagbe ein Array sein oder hab ich da irgendwie was falsch gemacht?
Habe noch so meine Array Verständnisschwierigkeiten bei Delphi

omata 13. Aug 2006 02:09

Re: Pagerank bei Google
 
Hallo bronco,

Delphi-Quellcode:
type
  TMyResult = array of byte;
  TMyResult2 = record
                 a, b, c:int64;
               end;
:
const
  GMAG = 3862272608;
:
function zeroFill(a, b:int64):int64;
const z = 2147483648;
begin
  if (z and a) > 0 then begin
    a:= (a shr 1);
    a:= a and (not z);
    a:= a or 1073741824;
    a:= (a shr (b-1));
  end
  else a:= (a shr b); // <-- Problemstelle
  Result:=a;
end;

function mix(a, b, c:int64):TMyResult2;
begin
  a:= a - b; a:= a - c; a:= a xor (zeroFill(c, 13));
  b:= b - c; b:= b - a; b:= b xor (a shl 8);
  c:= c - a; c:= c - b; c:= c xor (zeroFill(b, 13));
  a:= a - b; a:= a - c; a:= a xor (zeroFill(c, 12));
  b:= b - c; b:= b - a; b:= b xor (a shl 16);
  c:= c - a; c:= c - b; c:= c xor (zeroFill(b, 5));
  a:= a - b; a:= a - c; a:= a xor (zeroFill(c, 3));
  b:= b - c; b:= b - a; b:= b xor (a shl 10);
  c:= c - a; c:= c - b; c:= c xor (zeroFill(b, 15));

  Result.a:=a;
  Result.b:=b;
  Result.c:=c;
end;

function GCH(url:TMyResult; laenge:integer = 0; init:int64 = GMAG):int64;
var a, b, c, len, k:int64;
    m:TMyResult2;
begin
  if laenge = 0 then
    laenge:=length(url);
  a:=2654435769;
  b:=2654435769;
  c:=init;
  k:=0;
  len:=laenge;
  while(len >= 12) do begin
    a:= a + (url[k+0] + (url[k+1] shl 8) + (url[k+2] shl 16) + (url[k+3] shl 24));
    b:= b + (url[k+4] + (url[k+5] shl 8) + (url[k+6] shl 16) + (url[k+7] shl 24));
    c:= c + (url[k+8] + (url[k+9] shl 8) + (url[k+10] shl 16) + (url[k+11] shl 24));
    m:=mix(a, b, c);
    a:= m.a;
    b:= m.b;
    c:= m.c;
    k:= k + 12;
    len:= len - 12;
  end;

  c:= c + laenge;
  if len = 11 then c:=c + (url[k+10] shl 24);
  if len >= 10 then c:=c + (url[k+9] shl 16);
  if len >= 9 then c:=c + (url[k+8] shl 8);
  if len >= 8 then b:=b + (url[k+7] shl 24);
  if len >= 7 then b:=b + (url[k+6] shl 16);
  if len >= 6 then b:=b + (url[k+5] shl 8);
  if len >= 5 then b:=b + (url[k+4]);
  if len >= 4 then a:=a + (url[k+3] shl 24);
  if len >= 3 then a:=a + (url[k+2] shl 16);
  if len >= 2 then a:=a + (url[k+1] shl 8);
  if len >= 1 then a:=a + (url[k+0]);

  Result:=mix(a, b, c).c;
end;

function strord(url:string):TMyResult;
var i:integer;
begin
  setlength(Result, length(url));
  for i:=1 to length(url) do
    Result[i-1]:=ord(url[i]);
end;

function getPR(url:string):string;
var ch:longint;
begin
  url:='info:' + url;
  ch:= GCH(strord(url));
  // hier fehlt noch der Rest
end;
leider gibt es eine Problemstelle, die in PHP etwas anderes liefert als in Delphi.

PHP: 4653896912 >> 13 = 43814
Delphi: 4653896912 shr 13 = 568102

Gruss
Thorsten

Flocke 13. Aug 2006 12:56

Re: Pagerank bei Google
 
zeroFill ist einfach ein vorzeichenloses shr, was in PHP so nicht geht. In Delphi müsstest du das einfach über "Integer(Cardinal(a) shr b)" abbilden können.

bronco 13. Aug 2006 15:53

Re: Pagerank bei Google
 
WAO Danke Leute!!
Aber nur um zu zeigen das ich auch was versucht habe! und kein Schnorrer bin!
Das hatte ich als Newbee geschrieben ich glaube ihr seht sofort die Unterschiede!!
Delphi-Quellcode:
function zeroFill(a, b: integer): integer;

begin

  if (($80000000 and a)<> 0) then begin
     a := (a shr 1);
     a := a and (not $80000000);
     a := a or $40000000;
     a := (a shr (b-1));
     result := a;
     end
  else begin
     a := (a shr b);
     result := a;
   end;
 end;



function mix(a, b, c : integer): integer;

 begin
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,13)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 8));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,13)));
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,12)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 16));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,5)));
  a := (a - b);
  a := (a - c);
  a := (a xor (zeroFill(c,3)));
  b := (b - c);
  b := (b - a);
  b := (b xor (a shl 10));
  c := (c - a);
  c := (c - b);
  c := (c xor (zeroFill(b,15)));

  result := mix(a, b, c);
end;


function GCH(URL: array of byte): integer;
    const GMAG = '$0xE6359A60';
    var a, b, c, k, lengths, len : integer;
    var mix : array of integer;

   begin
    lengths := SizeOf(URL);
    a := StrToInt('$0x9E3779B9');
    b := a;
    c := StrToInt(GMAG);
    k := 0;
    len := lengths;

    while(len >= 12) do begin
        a := (a + (URL[k+0] + (URL[k+1]shl 8) + (URL[k+2]shl 16) + (URL[k+3]shl 24)));
        b := (b + (URL[k+4] + (URL[k+5]shl 8) + (URL[k+6]shl 16) + (URL[k+7]shl 24)));
        c := (c + (URL[k+8] + (URL[k+9]shl 8) + (URL[k+10]shl 16)+ (URL[k+11]shl 24)));
        mix := mix(a, b, c);
        a := mix[0];
        b := mix[1];
        c := mix[2];
        k := (k + 12);
        len := (len - 12);
    end;

    c := (c + lengths);
    case len of
        11: c := c + (URL[k+10] shl 24);
        10: c := c + (URL[k+9] shl 16);
        9 : c := c + (URL[k+8] shl 8);
        8 : b := b + (URL[k+7] shl 24);
        7 : b := b + (URL[k+6] shl 16);
        6 : b := b + (URL[k+5] shl 8);
        5 : b := b + (URL[k+4]);
        4 : a := a + (URL[k+3] shl 24);
        3 : a := a + (URL[k+2] shl 16);
        2 : a := a + (URL[k+1] shl 8);
        1 : a := a + (URL[k+0]);
      //   case 0: nothing left to add
     end;
     mix := mix(a, b, c);
    result:= mix[2];
 end;

omata 13. Aug 2006 17:36

Re: Pagerank bei Google
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier ist das fertige Projekt...

@Flocke: danke für den Tipp.

Gruss
Thorsten

bronco 13. Aug 2006 17:43

Re: Pagerank bei Google
 
Mega Fett!! Tausend Dank :shock: :dancer2: :hello:

capo 14. Aug 2006 09:24

Re: Pagerank bei Google
 
Hallo

ich hab mir das ganze auch mal angesehen und hab noch ein paar fragen dazu.
wofür steht folgendes, bzw. wie kommt man auf solche zahlen?

1.
Delphi-Quellcode:
const
  GMAG = 3862272608;
2.
Delphi-Quellcode:
 const z = 2147483648;
3.
Delphi-Quellcode:
 a:= a or 1073741824;
4.
Delphi-Quellcode:
 a:=2654435769;
     b:=2654435769;
würde den code auch gerne verstehen.

grüsse, capo

Garfield 14. Aug 2006 11:55

Re: Pagerank bei Google
 
Da gibt einige Informationen: http://de.pr10.info/index.php


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz