您的位置:知蚁博客 » C/C++程序设计 » C++方式实现最新的Google PR查询算法(附程序源码)

C++方式实现最新的Google PR查询算法(附程序源码)

作者: 发布时间:2011-11-04 分类:C/C++程序设计 标签: 3,198人浏览

  Google PR(Page Rank)是站长们比较关注同时也很熟悉的一个概念了,目前PHP版本的查询算法比较多,知蚁今天要用C++代码来实现Google PR的查询算法,C++的朋友们可以high下了!

  早就有传闻Google不再更新PR了,可是今年确实不断的在更新PR,在10月份的时候竟然连查询算法都改了,原先知蚁站长助手工具中的Google PR查询功能也失效了,没办法,只能研究新算法,改!

如何查询Google PR?

http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=6858375932&ie=UTF-8&oe=UTF-8&features=Rank&q=info:http://www.letuknowit.com/

  上面的那一串url地址就是用来查询知蚁博客(http://www.letuknowit.com/)的PR值得,点击上面的网址会得到下面的内容:

Rank_1:1:0

其中最后一个,也就是后面的那个红色的0就是查询到的PR值了(说来惭愧,知蚁博客都开博客半年了,目前还是个鸭蛋,朋友们有空要多来支持支持啊,O(∩_∩)O~)

  下面再说说那一串url地址中我们需要关注的地方,一共有两个地方,第一个是最后“info:”后面的地址,这里就是要查询的网址了,另一个地方是“ch=6858375932” ,这其实是根据网址计算出来的哈希值,网址不同ch的值也就不同。

  下面就说说如何使用C++代码来计算这个ch吧。

如何使用C++代码查询Google PR?

  一句话,就是根据网址计算ch值,构建Google PR查询url地址,然后读取网页内容,取出PR值即可!直接上代码吧。

  1. const unsigned int GOOGLE_MAGIC = 0xE6359A60;
  2. static void _mix(unsigned int &a, unsigned int &b, unsigned int &c)
  3. {
  4.     a -= b; a -= c; a ^= c >> 13;
  5.     b -= c; b -= a; b ^= a << 8;
  6.     c -= a; c -= b; c ^= b >> 13;
  7.     a -= b; a -= c; a ^= c >> 12;
  8.     b -= c; b -= a; b ^= a << 16;
  9.     c -= a; c -= b; c ^= b >> 5;
  10.     a -= b; a -= c; a ^= c >> 3;
  11.     b -= c; b -= a; b ^= a << 10;
  12.     c -= a; c -= b; c ^= b >> 15;
  13. }
  14. static unsigned int GoogleCH(unsigned int * url,int length)
  15. {
  16.     unsigned int a, b;
  17.     unsigned int c = GOOGLE_MAGIC;
  18.     unsigned int k = 0;
  19.     unsigned int len = length;
  20.     a = b = 0x9E3779B9;
  21.     while (len >= 12)
  22.     {
  23.         a += (url[k + 0] + (url[k + 1] << 8 ) + (url[k + 2] << 16) + (url[k + 3] << 24));
  24.         b += (url[k + 4] + (url[k + 5] << 8 ) + (url[k + 6] << 16) + (url[k + 7] << 24));
  25.         c += (url[k + 8] + (url[k + 9] << 8 ) + (url[k + 10] << 16) + (url[k + 11] << 24));
  26.         _mix(a, b, c);
  27.         k += 12;
  28.         len -= 12;
  29.     }
  30.     c += length;
  31.     switch (len) /* all the case statements fall through */
  32.     {
  33.         case 11:
  34.             c += (url[k + 10] << 24);
  35.         case 10:
  36.             c += (url[k + 9] << 16);
  37.         case 9:
  38.             c += (url[k + 8] << 8);
  39.         /* the first byte of c is reserved for the length */
  40.         case 8:
  41.             b += (url[k + 7] << 24);
  42.         case 7:
  43.             b += (url[k + 6] << 16);
  44.         case 6:
  45.             b += (url[k + 5] << 8);
  46.         case 5:
  47.             b += (url[k + 4]);
  48.         case 4:
  49.             a += (url[k + 3] << 24);
  50.         case 3:
  51.             a += (url[k + 2] << 16);
  52.         case 2:
  53.             a += (url[k + 1] << 8);
  54.         case 1:
  55.             a += (url[k + 0]);
  56.             break;
  57.         default:
  58.             break;
  59.         /* case 0: nothing left to add */
  60.     }
  61.     _mix(a, b, c);
  62.     return c;
  63. }
  64. unsigned int * c32to8bit(unsigned int * src,int length)
  65. {
  66.     unsigned int *buf = new unsigned int[length*4];
  67.     for(int i=0; i<length; i++)
  68.     {
  69.         for(int bitOrder = i*4; bitOrder<= i*4 + 3;bitOrder++)
  70.         {
  71.             buf[bitOrder] = src[i] & 255;
  72.             src[i] = (src[i] >> 8);
  73.         }
  74.     }
  75.     return buf;
  76. }
  77. static unsigned int NewGoogleCH(unsigned int oldch)
  78. {
  79.     unsigned int *pbuf = NULL;
  80.     unsigned int buf[20] = {0};
  81.     unsigned int uHashValue = oldch;
  82.     uHashValue = (((uHashValue / 7) << 2) | (((unsigned int)(uHashValue % 13)) & 7));
  83.     buf[0] = uHashValue;
  84.     for(int i=1; i<20; i++)
  85.     {
  86.         buf[i] = buf[i-1] – 9;
  87.     }
  88.     pbuf = c32to8bit(buf,20);
  89.     uHashValue = GoogleCH(pbuf, 80);
  90.     delete [] pbuf;
  91.     return uHashValue;
  92. }
  93. static unsigned int GoogleCH(CString url)
  94. {
  95.     unsigned int uHashValue = 0;
  96.     string strurl(url.GetBuffer(url.GetLength()));
  97.     url.ReleaseBuffer();
  98.     strurl = "info:"+strurl;
  99.     unsigned int *prbuf = new unsigned int[strurl.size()];
  100.     for(size_t i=0; i<strurl.size(); i++)
  101.     {
  102.         prbuf[i] = (unsigned int)strurl[i];
  103.     }
  104.     uHashValue = GoogleCH(prbuf, strurl.size());
  105.     uHashValue = NewGoogleCH(uHashValue);
  106.     return uHashValue;
  107. }

示例工程下载,工程为VS2008创建,低版本的朋友请参考代码自己实现下,灰常简单~\(≧▽≦)/~啦啦啦:

  感谢您一直看到这里,希望本文能够对你有用,有问题也请在评论中留言反馈,希望各位多多关注知蚁博客!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/147

相关文章

11访客评论 ,博主回复3

  1. 看来博主是个编程高手啊!

    洫之舞11-05 00:06 回复
  2. C语言好难学啊,你真是个天才

    药油11-05 16:11 回复
  3. 你很厉害,不过我觉得不应该用C++查询,这样不方便,不妨找出php、jsp的查询算法,这样可以在网站后台查询。

    DH11-05 16:34 回复
    • php版本的到处都是了,目前c++版本的基本很少,所以就实现了下

      知蚁11-05 20:08 回复
  4. 很牛啊,知蚁

    愚人笔记11-06 22:49 回复
  5. 真是个天才啊。。。哈哈

    视频会议11-08 11:30 回复
  6. 感谢您一直看到这里——不用感谢,我是鼠标滚轮一直滚下来的,代码盲表示压力巨大~~~

    松鼠男11-10 21:14 回复
  7. 直接从网页获取 呵呵~

    李木11-22 08:45 回复
  8. 很强大的。。

    love02xp12-05 13:27 回复
  9. 牛人哦,不错。我是过来围观的

    宁小邦12-15 12:56 回复
  10. 不错 不错 ~代码风格很好

    xushine01-09 01:05 回复
  11. 请教博主这个哈希算法哪来的?依据什么?谢谢

    isayme03-01 20:39 回复

我来说说

(必须)

(必须,保密)

你确定你已经看过文章了?
取消

无觅相关文章插件,快速提升流量