Delphi-PRAXiS

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

DP-Maintenance 14. Aug 2006 12:27

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Sonstige Fragen zu Delphi" nach "Programmieren allgemein" verschoben.
Hat nicht wirklich was mit Delphi zu tun, oder?

DP-Maintenance 14. Aug 2006 13:22

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Zitat:

Hat nicht wirklich was mit Delphi zu tun, oder?
Dann lies noch mal Feuervogel ;)

omata 14. Aug 2006 14:57

Re: Pagerank bei Google
 
Hallo capo,
Zitat:

Zitat von capo
wofür steht folgendes, bzw. wie kommt man auf solche zahlen?

ich weiss jetzt nicht genau was du willst. Ich habe mir den Algorithmus nicht ausgedacht. Ausgangspunkt war das PHP-Skript. Ich habe nicht versucht zu verstehen was da im Ganzen abgeht. Ich habe mich immer nur auf die einzelnen Zeilen konzentriert und diese nach Delphi umgesetzt.
Zitat:

Zitat von capo
1.
Delphi-Quellcode:
const GMAG = 3862272608;

Ausgangspunkt:
Zitat:

Zitat von bronco
Code:
define('GMAG', 0xE6359A60);

Eine einfache Ausgabe der Konstante durch PHP brachte die Dezimalzahl zum vorschein.

Zitat:

Zitat von capo
2.
Delphi-Quellcode:
 const z = 2147483648;

Ausgangspunkt:
Zitat:

Zitat von bronco
Code:
$z = hexdec(80000000);

Auch hier genügte eine einfache Ausgabe.

Zitat:

Zitat von capo
3.
Delphi-Quellcode:
 a:= a or 1073741824;

Ausgangspunkt:
Zitat:

Zitat von bronco
Code:
$a |= 0x40000000;

Dies ist ausgeschrieben $a = $a | 0x40000000 also ein bitweiser ODER-Vergleich mit einer Konstanten. Konstante wieder durch einfache Ausgabe ermittelt.

Zitat:

Zitat von capo
4.
Delphi-Quellcode:
 a:=2654435769;
b:=2654435769;

Ausgangspunkt:
Zitat:

Zitat von bronco
Code:
$a = $b = 0x9E3779B9;

In PHP kann man wie in C Mehrfachzuweisungen benutzen. Also ausgeschrieben steht dort
Code:
$a = 0x9E3779B9;
$b = 0x9E3779B9;
Konstante wurden wieder durch einfache Ausgabe ermittelt.

Zitat:

Zitat von capo
würde den code auch gerne verstehen.

War es das was du wissen wolltest? Bin mir da nicht wirklich sicher.

Gruss
Thorsten

capo 25. Aug 2006 13:45

Re: Pagerank bei Google
 
hallo omata
ich bin in den letzten tagen nicht dazu gekommen mich damit zu beschäftigen, aber ich mente das ich nicht verstehe wie es überhaupt zu diesen zahlen kommt.
danke für deine antwort.

gruss, capo

himitsu 25. Aug 2006 14:00

Re: Pagerank bei Google
 
Die Werte mit dem 0x am Anfang sind Hexadezimalwerte ... die ohne war davor einfach nur die umgerechnteten Dezimalwerte.

Man hätte es auch ganz leicht im Hexadezimalen lassen können:
0xE6359A60 > $E6359A60

Zum umrechnen könntest du z.B. auch den WindowsRechner nutzen ... schalte den einfach mal über das Menü in den Wissenschaftlichen Modus um, dann tauchen HEX und DEC (zum Umrechnen) auf :angel:

capo 30. Aug 2006 12:35

Re: Pagerank bei Google
 
Hallo...
danke für die info (Hexadezimalwerte)

aber, ich drück mich wohl ständig falsch aus.
ich meine,
warum steht da
Delphi-Quellcode:
const z = 2147483648;
es könnte ja auch
Delphi-Quellcode:
const z = 1;
dastehen
wie kommt es zu dieser größe?

gruss vom capo :coder2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.

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