Thema: Delphi Pagerank bei Google

Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Pagerank bei Google

  Alt 13. Aug 2006, 02:09
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
  Mit Zitat antworten Zitat