C# Google PageRank .net库 (checksum)

2005-12-19 10:35:42  作者

  今天看到Google PageRank ChecksumPHP代码才发现上次发布的库写的很烂,我根本没有去理解里面的意思,有很多函数是没有必要的,如%26lt;%26lt; %26gt;%26gt;位操作都已经是现成的,我怎么还照着vb代码改写,真是愚蠢。
  为了弥补我的愚蠢,把php代码改编成的.net库,发布出来。

  Google PageRank 链接库下载地址http://code.knowsky.com/down/2847.html

  演示地址http://pr.csharphack.org/checkpr.aspx

  使用实例
  //得到Pagerank值
  Console.WriteLine(PRCrack.PageRank.CheckPR("http://www.google.com"));
  //得到pagerank checksum
  Console.WriteLine(PRCrack.PageRank.OutputCheckSum("http://www.google.com",1));

  包含函数
  //输出指定网址的pagerank checksum
  //参数m_Version指定1,表示得到新版本checksum,Google Toolbar版本%26gt;%26gt;=2.0.114
  //参数m_Version指定0,表示得到老版本checksum,Google Toolbar版本%26lt;2.0.114
  public static string OutputCheckSum(string m_Url,int m_Version)

  //输出制定网址的pagerank
  public static string CheckPR(string m_Url)
  Checksum 算法源代码请看具体内容

1using System;
2
3namespace PRCrack
4{
5/// %26lt;summary%26gt;
6/// Google PageRank的Checksum算法。
7/// 作者:4111y80y
8/// 日期:2005年1月22日
9/// email:sillyboy@china.com
10/// %26lt;/summary%26gt;
11class CheckSum
12{
13public CheckSum()
14{
15//
16// TODO: 在此处添加构造函数逻辑
17//
18}
19
20uint GOOGLE_MAGIC=0xE6359A60;
21
22private uint zeroFill(uint a, int b)
23{
24checked
25{
26uint z = 0x80000000;
27if (Convert.ToBoolean(z %26amp; a))
28{
29a = (a%26gt;%26gt;1);
30a %26amp;= (~z);
31a |= 0x40000000;
32a = (a%26gt;%26gt;(b-1));
33}
34else
35{
36a = (a%26gt;%26gt;b);
37}
38}
39return a;
40}
41
42private uint[] mix(uint a,uint b,uint c)
43{
44a -= b; a -= c; a ^= (uint)(zeroFill(c,13));
45b -= c; b -= a; b ^= (uint)(a%26lt;%26lt;8);
46c -= a; c -= b; c ^= (uint)(zeroFill(b,13));
47a -= b; a -= c; a ^= (uint)(zeroFill(c,12));
48b -= c; b -= a; b ^= (uint)(a%26lt;%26lt;16);
49c -= a; c -= b; c ^= (uint)(zeroFill(b,5));
50a -= b; a -= c; a ^= (uint)(zeroFill(c,3));
51b -= c; b -= a; b ^= (uint)(a%26lt;%26lt;10);
52c -= a; c -= b; c ^= (uint)(zeroFill(b,15));
53
54return new uint[3]{a,b,c};
55}
56
57private uint GoogleCH(uint[] url, uint length, uint init)
58{
59if(length==0)
60{
61length = (uint)url.Length;
62}
63uint a ,b;
64a=b= 0x9E3779B9;
65uint c = init;
66int k = 0;
67uint len = length;
68uint[] m_mix=new uint[3];
69while(len %26gt;= 12)
70{
71a += (uint)(url[k+0] +(url[k+1]%26lt;%26lt;8) +(url[k+2]%26lt;%26lt;16) +(url[k+3]%26lt;%26lt;24));
72
73b += (uint)(url[k+4] +(url[k+5]%26lt;%26lt;8) +(url[k+6]%26lt;%26lt;16) +(url[k+7]%26lt;%26lt;24));
74c += (uint)(url[k+8] +(url[k+9]%26lt;%26lt;8) +(url[k+10]%26lt;%26lt;16)+(url[k+11]%26lt;%26lt;24));
75m_mix = mix(a,b,c);
76a = m_mix[0]; b = m_mix[1]; c = m_mix[2];
77
78k += 12;
79len -= 12;
80}
81
82c += length;
83
84switch(len) /* all the case statements fall through */
85{
86case 11:
87{
88c+=(uint)(url[k+10]%26lt;%26lt;24);
89c+=(uint)(url[k+9]%26lt;%26lt;16);
90c+=(uint)(url[k+8]%26lt;%26lt;8);
91b+=(uint)(url[k+7]%26lt;%26lt;24);
92b+=(uint)(url[k+6]%26lt;%26lt;16);
93b+=(uint)(url[k+5]%26lt;%26lt;8);
94b+=(uint)(url[k+4]);
95a+=(uint)(url[k+3]%26lt;%26lt;24);
96a+=(uint)(url[k+2]%26lt;%26lt;16);
97a+=(uint)(url[k+1]%26lt;%26lt;8);
98a+=(uint)(url[k+0]);
99break;
100}
101case 10:
102{
103c+=(uint)(url[k+9]%26lt;%26lt;16);
104c+=(uint)(url[k+8]%26lt;%26lt;8);
105b+=(uint)(url[k+7]%26lt;%26lt;24);
106b+=(uint)(url[k+6]%26lt;%26lt;16);
107b+=(uint)(url[k+5]%26lt;%26lt;8);
108b+=(uint)(url[k+4]);
109a+=(uint)(url[k+3]%26lt;%26lt;24);
110a+=(uint)(url[k+2]%26lt;%26lt;16);
111a+=(uint)(url[k+1]%26lt;%26lt;8);
112a+=(uint)(url[k+0]);
113break;
114}
115case 9 :
116{
117c+=(uint)(url[k+8]%26lt;%26lt;8);
118b+=(uint)(url[k+7]%26lt;%26lt;24);
119b+=(uint)(url[k+6]%26lt;%26lt;16);
120b+=(uint)(url[k+5]%26lt;%26lt;8);
121b+=(uint)(url[k+4]);
122a+=(uint)(url[k+3]%26lt;%26lt;24);
123a+=(uint)(url[k+2]%26lt;%26lt;16);
124a+=(uint)(url[k+1]%26lt;%26lt;8);
125a+=(uint)(url[k+0]);
126break;
127}
128/* the first byte of c is reserved for the length */
129case 8 :
130{
131b+=(uint)(url[k+7]%26lt;%26lt;24);
132b+=(uint)(url[k+6]%26lt;%26lt;16);
133b+=(uint)(url[k+5]%26lt;%26lt;8);
134b+=(uint)(url[k+4]);
135a+=(uint)(url[k+3]%26lt;%26lt;24);
136a+=(uint)(url[k+2]%26lt;%26lt;16);
137a+=(uint)(url[k+1]%26lt;%26lt;8);
138a+=(uint)(url[k+0]);
139break;
140}
141case 7 :
142{
143b+=(uint)(url[k+6]%26lt;%26lt;16);
144b+=(uint)(url[k+5]%26lt;%26lt;8);
145b+=(uint)(url[k+4]);
146a+=(uint)(url[k+3]%26lt;%26lt;24);
147a+=(uint)(url[k+2]%26lt;%26lt;16);
148a+=(uint)(url[k+1]%26lt;%26lt;8);
149a+=(uint)(url[k+0]);
150break;
151}
152case 6 :
153{
154b+=(uint)(url[k+4]);
155a+=(uint)(url[k+3]%26lt;%26lt;24);
156a+=(uint)(url[k+2]%26lt;%26lt;16);
157a+=(uint)(url[k+1]%26lt;%26lt;8);
158a+=(uint)(url[k+0]);
159break;
160}
161case 5 :
162{
163b+=(uint)(url[k+4]);
164a+=(uint)(url[k+3]%26lt;%26lt;24);
165a+=(uint)(url[k+2]%26lt;%26lt;16);
166a+=(uint)(url[k+1]%26lt;%26lt;8);
167a+=(uint)(url[k+0]);
168break;
169}
170case 4 :
171{
172a+=(uint)(url[k+3]%26lt;%26lt;24);
173a+=(uint)(url[k+2]%26lt;%26lt;16);
174a+=(uint)(url[k+1]%26lt;%26lt;8);
175a+=(uint)(url[k+0]);
176break;
177}
178case 3 :
179{
180a+=(uint)(url[k+2]%26lt;%26lt;16);
181a+=(uint)(url[k+1]%26lt;%26lt;8);
182a+=(uint)(url[k+0]);
183break;
184}
185case 2 :
186{
187a+=(uint)(url[k+1]%26lt;%26lt;8);
188a+=(uint)(url[k+0]);
189break;
190}
191case 1 :
192{
193a+=(uint)(url[k+0]);
194break;
195}
196/* case 0: nothing left to add */
197}
198m_mix = mix(a,b,c);
199/*-------------------------------------------- report the result */
200return m_mix[2];
201}
202
203private uint GoogleCH(string url, uint length)
204{
205uint[] m_urluint=new uint[url.Length];
206for(int i=0;i%26lt;url.Length;i++)
207{
208m_urluint[i]=url[i];
209}
210return GoogleCH(m_urluint,length,GOOGLE_MAGIC);
211}
212
213private uint GoogleCH(string sURL)
214{
215return GoogleCH(sURL,0);
216}
217
218private uint GoogleCH(uint[] url, uint length)
219{
220return GoogleCH(url, length, GOOGLE_MAGIC);
221}
222
223private uint[] c32to8bit(uint[] arr32)
224{
225uint[] arr8=new uint[arr32.GetLength(0)*4+3];
226
227for(int i=0;i%26lt;arr32.GetLength(0);i++)
228{
229for (int bitOrder=i*4;bitOrder%26lt;=i*4+3;bitOrder++)
230{
231arr8[bitOrder]=arr32[i]%26amp;255;
232arr32[i]=zeroFill(arr32[i], 8);
233}
234}
235return arr8;
236}
237
238//新算法,ToolBar 版本%26gt;%26gt;=2.0.114
239public string CalculateChecksum(string sURL)
240{
241uint ch=GoogleCH("info:" + sURL);
242
243ch = (((ch/7) %26lt;%26lt; 2) | (((uint)(ch%13))%26amp;7));
244
245uint[] prbuf = new uint[20];
246prbuf[0] = ch;
247for(int i = 1; i %26lt; 20; i++) {
248prbuf[i] = prbuf[i-1]-9;
249}
250ch = GoogleCH(c32to8bit(prbuf), 80);
251
252return string.Format("6{0}",ch);
253}
254
255//老算法,ToolBar 版本%26lt;2.0.114
256public string CalculateChecksumOld(string sURL)
257{
258uint ch=GoogleCH("info:" + sURL);
259
260string CalculateChecksum = "6" + Convert.ToString((ch));
261return CalculateChecksum;
262}
263}
264}