用delphi计算google工具栏pagerank的校验和

用delphi计算google工具栏pagerank的校验和,delphi,pagerank,Delphi,Pagerank,以下是请求pagerank的常规url: 以下是一个工作示例url: 如何使用delphi计算校验和?本页声称包含校验和算法: 那里的代码是用C编写的,但是将其移植到Delphi非常简单。甚至直接编译到.obj并链接到 这是我在港口的快速尝试。也许你会发现它很有用。在真正使用它之前,我当然想做一些适当的测试 {$OVERFLOWCHECKS OFF} program pagerank; {$APPTYPE CONSOLE} uses SysUtils; function Conve

以下是请求pagerank的常规url:

以下是一个工作示例url:


如何使用delphi计算校验和?

本页声称包含校验和算法:

那里的代码是用C编写的,但是将其移植到Delphi非常简单。甚至直接编译到.obj并链接到

这是我在港口的快速尝试。也许你会发现它很有用。在真正使用它之前,我当然想做一些适当的测试

{$OVERFLOWCHECKS OFF}
program pagerank;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ConvertStrToInt(pStr: PAnsiChar; Init, Factor: Integer): Integer;
begin
  Result := Init;
  while pStr^<>#0 do
  begin
    Result := Result*Factor;
    inc(Result, ord(pStr^));
    inc(pStr);
  end;
end;

function HashURL(pStr: PAnsiChar): Integer;
var
  C1, C2, T1, T2: Cardinal;
begin
  C1 := ConvertStrToInt(pStr, $1505, $21);
  C2 := ConvertStrToInt(pStr, 0, $1003F);
  C1 := C1 shr 2;
  C1 := ((C1 shr 4) and $3FFFFC0) or (C1 and $3F);
  C1 := ((C1 shr 4) and $3FFC00) or (C1 and $3FF);
  C1 := ((C1 shr 4) and $3C000) or (C1 and $3FFF);

  T1 := (C1 and $3C0) shl 4;
  T1 := T1 or (C1 and $3C);
  T1 := (T1 shl 2) or (C2 and $F0F);

  T2 := (C1 and $FFFFC000) shl 4;
  T2 := T2 or (C1 and $3C00);
  T2 := (T2 shl $A) or (C2 and $F0F0000);

  Result := Integer(T1 or T2);
end;

function CheckHash(HashInt: Cardinal): AnsiChar;
var
  Check, Remainder: Integer;
  Flag: Boolean;
begin
  Check := 0;
  Flag := False;
  repeat
    Remainder := HashInt mod 10;
    HashInt := HashInt div 10;
    if Flag then
    begin
      inc(Remainder, Remainder);
      Remainder := (Remainder div 10) + (Remainder mod 10);
    end;
    inc(Check, Remainder);
    Flag := not Flag;
  until HashInt=0;

  Check := Check mod 10;
  if Check<>0 then
  begin
    Check := 10-Check;
    if Flag then
    begin
      if (Check mod 2)=1 then
        inc(Check, 9);
      Check := Check shr 1;
    end;
  end;
  inc(Check, $30);
  Result := AnsiChar(Check);
end;

function PageRankCheckSum(const URL: string): string;
var
  HashInt: Cardinal;
begin
  HashInt := Cardinal(HashURL(PAnsiChar(AnsiString(URL))));
  Result := Format('7%s%u', [CheckHash(HashInt), HashInt]);
end;

procedure Main;
begin
  if ParamCount<>1 then
  begin
    Writeln(Format('Usage: %s [URL]', 
      [ChangeFileExt(ExtractFileName(ParamStr(0)), '')]));
    exit;
  end;

  Writeln('Checksum='+PageRankCheckSum(ParamStr(1)));
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
{$OVERFLOWCHECKS-OFF}
程序pagerank;
{$APPTYPE控制台}
使用
SysUtils;
函数convertstroint(pStr:PAnsiChar;Init,Factor:Integer):整数;
开始
结果:=Init;
而pStr^#0可以
开始
结果:=结果*因子;
公司(结果,作战需求文件(pStr^));
公司(pStr);
结束;
结束;
函数HashURL(pStr:PAnsiChar):整数;
变量
C1,C2,T1,T2:基数;
开始
C1:=转换器接口(pStr,$1505,$21);
C2:=convertstroint(pStr,0,$1003F);
C1:=C1 shr 2;
C1:=((C1 shr 4)和$3FFFFC0)或(C1和$3F);
C1:=((C1 shr 4)和$3FFC00)或(C1和$3FF);
C1:=((C1 shr 4)和$3C000)或(C1和$3FFF);
T1:=(C1和$3C0)第4列;
T1:=T1或(C1和$3C);
T1:=(T1第2列)或(C2和$F0F);
T2:=(C1和$FFFFC000)第4列;
T2:=T2或(C1和$3C00);
T2:=(T2 shl$A)或(C2和$F0000);
结果:=整数(T1或T2);
结束;
函数CheckHash(HashInt:Cardinal):AnsiChar;
变量
检查,余数:整数;
标志:布尔;
开始
检查:=0;
标志:=假;
重复
余数:=HashInt mod 10;
HashInt:=HashInt div 10;
如果旗子那么
开始
公司(剩余,剩余);
余数:=(余数第10部分)+(余数第10部分);
结束;
inc(支票、余款);
标志:=非标志;
直到HashInt=0;
检查:=检查模块10;
如果选择0,则
开始
支票:=10张支票;
如果旗子那么
开始
如果(检查模块2)=1,则
公司(支票,9);
检查:=检查shr 1;
结束;
结束;
公司(30美元支票);
结果:=AnsiChar(检查);
结束;
函数PageRankCheckSum(consturl:string):string;
变量
哈辛:红衣主教;
开始
HashInt:=基数(HashURL(PAnsiChar(AnsiString(URL)));
结果:=格式('7%s%u',[CheckHash(HashInt),HashInt]);
结束;
主程序;
开始
如果参数为1,则
开始
Writeln(格式('用法:%s[URL]”,
[ChangeFileExt(ExtractFileName(ParamStr(0)),'');
出口
结束;
Writeln('Checksum='+PageRankCheckSum(ParamStr(1));
结束;
开始
尝试
主要的;
除了
关于E:Exception-do
Writeln(E.ClassName,“:”,E.Message);
结束;
结束。

本页声称包含校验和算法:

那里的代码是用C编写的,但是将其移植到Delphi非常简单。甚至直接编译到.obj并链接到

这是我在港口的快速尝试。也许你会发现它很有用。在真正使用它之前,我当然想做一些适当的测试

{$OVERFLOWCHECKS OFF}
program pagerank;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ConvertStrToInt(pStr: PAnsiChar; Init, Factor: Integer): Integer;
begin
  Result := Init;
  while pStr^<>#0 do
  begin
    Result := Result*Factor;
    inc(Result, ord(pStr^));
    inc(pStr);
  end;
end;

function HashURL(pStr: PAnsiChar): Integer;
var
  C1, C2, T1, T2: Cardinal;
begin
  C1 := ConvertStrToInt(pStr, $1505, $21);
  C2 := ConvertStrToInt(pStr, 0, $1003F);
  C1 := C1 shr 2;
  C1 := ((C1 shr 4) and $3FFFFC0) or (C1 and $3F);
  C1 := ((C1 shr 4) and $3FFC00) or (C1 and $3FF);
  C1 := ((C1 shr 4) and $3C000) or (C1 and $3FFF);

  T1 := (C1 and $3C0) shl 4;
  T1 := T1 or (C1 and $3C);
  T1 := (T1 shl 2) or (C2 and $F0F);

  T2 := (C1 and $FFFFC000) shl 4;
  T2 := T2 or (C1 and $3C00);
  T2 := (T2 shl $A) or (C2 and $F0F0000);

  Result := Integer(T1 or T2);
end;

function CheckHash(HashInt: Cardinal): AnsiChar;
var
  Check, Remainder: Integer;
  Flag: Boolean;
begin
  Check := 0;
  Flag := False;
  repeat
    Remainder := HashInt mod 10;
    HashInt := HashInt div 10;
    if Flag then
    begin
      inc(Remainder, Remainder);
      Remainder := (Remainder div 10) + (Remainder mod 10);
    end;
    inc(Check, Remainder);
    Flag := not Flag;
  until HashInt=0;

  Check := Check mod 10;
  if Check<>0 then
  begin
    Check := 10-Check;
    if Flag then
    begin
      if (Check mod 2)=1 then
        inc(Check, 9);
      Check := Check shr 1;
    end;
  end;
  inc(Check, $30);
  Result := AnsiChar(Check);
end;

function PageRankCheckSum(const URL: string): string;
var
  HashInt: Cardinal;
begin
  HashInt := Cardinal(HashURL(PAnsiChar(AnsiString(URL))));
  Result := Format('7%s%u', [CheckHash(HashInt), HashInt]);
end;

procedure Main;
begin
  if ParamCount<>1 then
  begin
    Writeln(Format('Usage: %s [URL]', 
      [ChangeFileExt(ExtractFileName(ParamStr(0)), '')]));
    exit;
  end;

  Writeln('Checksum='+PageRankCheckSum(ParamStr(1)));
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
{$OVERFLOWCHECKS-OFF}
程序pagerank;
{$APPTYPE控制台}
使用
SysUtils;
函数convertstroint(pStr:PAnsiChar;Init,Factor:Integer):整数;
开始
结果:=Init;
而pStr^#0可以
开始
结果:=结果*因子;
公司(结果,作战需求文件(pStr^));
公司(pStr);
结束;
结束;
函数HashURL(pStr:PAnsiChar):整数;
变量
C1,C2,T1,T2:基数;
开始
C1:=转换器接口(pStr,$1505,$21);
C2:=convertstroint(pStr,0,$1003F);
C1:=C1 shr 2;
C1:=((C1 shr 4)和$3FFFFC0)或(C1和$3F);
C1:=((C1 shr 4)和$3FFC00)或(C1和$3FF);
C1:=((C1 shr 4)和$3C000)或(C1和$3FFF);
T1:=(C1和$3C0)第4列;
T1:=T1或(C1和$3C);
T1:=(T1第2列)或(C2和$F0F);
T2:=(C1和$FFFFC000)第4列;
T2:=T2或(C1和$3C00);
T2:=(T2 shl$A)或(C2和$F0000);
结果:=整数(T1或T2);
结束;
函数CheckHash(HashInt:Cardinal):AnsiChar;
变量
检查,余数:整数;
标志:布尔;
开始
检查:=0;
标志:=假;
重复
余数:=HashInt mod 10;
HashInt:=HashInt div 10;
如果旗子那么
开始
公司(剩余,剩余);
余数:=(余数第10部分)+(余数第10部分);
结束;
inc(支票、余款);
标志:=非标志;
直到HashInt=0;
检查:=检查模块10;
如果选择0,则
开始
支票:=10张支票;
如果旗子那么
开始
如果(检查模块2)=1,则
公司(支票,9);
检查:=检查shr 1;
结束;
结束;
公司(30美元支票);
结果:=AnsiChar(检查);
结束;
函数PageRankCheckSum(consturl:string):string;
变量
哈辛:红衣主教;
开始
HashInt:=基数(HashURL(PAnsiChar(AnsiString(URL)));
结果:=格式('7%s%u',[CheckHash(HashInt),HashInt]);
结束;
主程序;
开始
如果参数为1,则
开始
Writeln(格式('用法:%s[URL]”,
[ChangeFileExt(ExtractFileName(ParamStr(0)),'');
出口
结束;
Writeln('Checksum='+PageRankCheckSum(ParamStr(1));
结束;
开始
尝试
主要的;
除了
关于E:Exception-do
Writeln(E.ClassName,“:”,E.Message);
结束;
结束。