Google PR(Page Rank)是站长们比较关注同时也很熟悉的一个概念了,目前PHP版本的查询算法比较多,知蚁今天要用C++代码来实现Google PR的查询算法,C++的朋友们可以high下了!
早就有传闻Google不再更新PR了,可是今年确实不断的在更新PR,在10月份的时候竟然连查询算法都改了,原先知蚁站长助手工具中的Google PR查询功能也失效了,没办法,只能研究新算法,改!
如何查询Google PR?
上面的那一串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值即可!直接上代码吧。
- const unsigned int GOOGLE_MAGIC = 0xE6359A60;
- static void _mix(unsigned int &a, unsigned int &b, unsigned int &c)
- {
- a -= b; a -= c; a ^= c >> 13;
- b -= c; b -= a; b ^= a << 8;
- c -= a; c -= b; c ^= b >> 13;
- a -= b; a -= c; a ^= c >> 12;
- b -= c; b -= a; b ^= a << 16;
- c -= a; c -= b; c ^= b >> 5;
- a -= b; a -= c; a ^= c >> 3;
- b -= c; b -= a; b ^= a << 10;
- c -= a; c -= b; c ^= b >> 15;
- }
- static unsigned int GoogleCH(unsigned int * url,int length)
- {
- unsigned int a, b;
- unsigned int c = GOOGLE_MAGIC;
- unsigned int k = 0;
- unsigned int len = length;
- a = b = 0x9E3779B9;
- while (len >= 12)
- {
- a += (url[k + 0] + (url[k + 1] << 8 ) + (url[k + 2] << 16) + (url[k + 3] << 24));
- b += (url[k + 4] + (url[k + 5] << 8 ) + (url[k + 6] << 16) + (url[k + 7] << 24));
- c += (url[k + 8] + (url[k + 9] << 8 ) + (url[k + 10] << 16) + (url[k + 11] << 24));
- _mix(a, b, c);
- k += 12;
- len -= 12;
- }
- c += length;
- switch (len) /* all the case statements fall through */
- {
- case 11:
- c += (url[k + 10] << 24);
- case 10:
- c += (url[k + 9] << 16);
- case 9:
- c += (url[k + 8] << 8);
- /* the first byte of c is reserved for the length */
- case 8:
- b += (url[k + 7] << 24);
- case 7:
- b += (url[k + 6] << 16);
- case 6:
- b += (url[k + 5] << 8);
- case 5:
- b += (url[k + 4]);
- case 4:
- a += (url[k + 3] << 24);
- case 3:
- a += (url[k + 2] << 16);
- case 2:
- a += (url[k + 1] << 8);
- case 1:
- a += (url[k + 0]);
- break;
- default:
- break;
- /* case 0: nothing left to add */
- }
- _mix(a, b, c);
- return c;
- }
- unsigned int * c32to8bit(unsigned int * src,int length)
- {
- unsigned int *buf = new unsigned int[length*4];
- for(int i=0; i<length; i++)
- {
- for(int bitOrder = i*4; bitOrder<= i*4 + 3;bitOrder++)
- {
- buf[bitOrder] = src[i] & 255;
- src[i] = (src[i] >> 8);
- }
- }
- return buf;
- }
- static unsigned int NewGoogleCH(unsigned int oldch)
- {
- unsigned int *pbuf = NULL;
- unsigned int buf[20] = {0};
- unsigned int uHashValue = oldch;
- uHashValue = (((uHashValue / 7) << 2) | (((unsigned int)(uHashValue % 13)) & 7));
- buf[0] = uHashValue;
- for(int i=1; i<20; i++)
- {
- buf[i] = buf[i-1] – 9;
- }
- pbuf = c32to8bit(buf,20);
- uHashValue = GoogleCH(pbuf, 80);
- delete [] pbuf;
- return uHashValue;
- }
- static unsigned int GoogleCH(CString url)
- {
- unsigned int uHashValue = 0;
- string strurl(url.GetBuffer(url.GetLength()));
- url.ReleaseBuffer();
- strurl = "info:"+strurl;
- unsigned int *prbuf = new unsigned int[strurl.size()];
- for(size_t i=0; i<strurl.size(); i++)
- {
- prbuf[i] = (unsigned int)strurl[i];
- }
- uHashValue = GoogleCH(prbuf, strurl.size());
- uHashValue = NewGoogleCH(uHashValue);
- return uHashValue;
- }
示例工程下载,工程为VS2008创建,低版本的朋友请参考代码自己实现下,灰常简单~\(≧▽≦)/~啦啦啦:
感谢您一直看到这里,希望本文能够对你有用,有问题也请在评论中留言反馈,希望各位多多关注知蚁博客!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/147
看来博主是个编程高手啊!
C语言好难学啊,你真是个天才
你很厉害,不过我觉得不应该用C++查询,这样不方便,不妨找出php、jsp的查询算法,这样可以在网站后台查询。
php版本的到处都是了,目前c++版本的基本很少,所以就实现了下
很牛啊,知蚁
真是个天才啊。。。哈哈
感谢您一直看到这里——不用感谢,我是鼠标滚轮一直滚下来的,代码盲表示压力巨大~~~
直接从网页获取 呵呵~
很强大的。。
牛人哦,不错。我是过来围观的
不错 不错 ~代码风格很好
请教博主这个哈希算法哪来的?依据什么?谢谢
这个好像是google自己的哈希算法
具体的原理请参考这篇文章:http://www.codeproject.com/Articles/20038/Request-Google-s-Page-rank-Programmatically