Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
Delphi 7 Enterprise
|
Re: Pagerank bei Google
13. Aug 2006, 03: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
|
|
Zitat
|