- Katılım
- 26 Ocak 2005
- Mesajlar
- 7,944
- Reaction score
- 258
Pagerank hesaplaması yapılabilmesi için Googleın checksum algoritmasından yararlanır. Blogumda bir süre önce bu program yapımı ile ilgili not düşmüştüm, api adresini bugün güncelledim yapımı da anlatayım dedim.
Uygulamamızda GooglePageRank classını oluşturup aşağıdaki metodları yazalım:
Not: using System.Net; ve using System.IO; namespaceleri baştan ekleyelim. (using System; ve using System.Windows.Forms; zaten mevcut durumda olacak)
private static void Mix(ref uint a, ref uint b, ref uint 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;
}
private static string GoogleChecksum(string url)
{
uint GoogleMagic = 0xE6359A60;
uint a, b;
uint c = GoogleMagic;
a = b = 0x9E3779B9;
int k = 0;
int length = url.Length;
//Algoritma
while (length >= 12)
{
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
b += (uint)(url[k + 4] + (url[k + 5] << 8) + (url[k + 6] << 16) + (url[k + 7] << 24));
c += (uint)(url[k + 8] + (url[k + 9] << 8) + (url[k + 10] << 16) + (url[k + 11] << 24));
Mix(ref a, ref b, ref c);
k += 12;
length -= 12;
}
c += (uint)url.Length;
switch (length)
{
case 11:
c += (uint)(url[k + 10] << 24);
goto case 10;
case 10:
c += (uint)(url[k + 9] << 16);
goto case 9;
case 9:
c += (uint)(url[k + 8] << 8);
goto case 8;
case 8:
b += (uint)(url[k + 7] << 24);
goto case 7;
case 7:
b += (uint)(url[k + 6] << 16);
goto case 6;
case 6:
b += (uint)(url[k + 5] << 8);
goto case 5;
case 5:
b += (uint)(url[k + 4]);
goto case 4;
case 4:
a += (uint)(url[k + 3] << 24);
goto case 3;
case 3:
a += (uint)(url[k + 2] << 16);
goto case 2;
case 2:
a += (uint)(url[k + 1] << 8);
goto case 1;
case 1:
a += (uint)(url[k + 0]);
break;
default:
break;
}
Mix(ref a, ref b, ref c);
return string.Format("6{0}", c);
}
public static int getPageRank(string url)
{
//URL checksum Hesaplama
string checkSum = GoogleChecksum("info:" + url);
string file = "http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=" + checkSum + "&features=Rank&q=info:" + url;
try
{
//Googledan PR verilerini alma
WebRequest request = WebRequest.Create(file);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string data = reader.ReadToEnd();
reader.Close();
response.Close();
//Parse PR from string
int pageRank = -1;
if (data.IndexOf(':') != -1)
{
data = data.Substring(data.LastIndexOf(':') + 1);
}
int.TryParse(data, out pageRank);
return pageRank;
}
catch (Exception)
{
return -1;
}
}
}
Yukarıda Googledan PR verilerini almak için gerekli metodlar classımızın içine yazıldı. Şimdi formumuza bir adet textbox, buton ve label ekleyelim. Ve classımızın getPageRank metodundan instance çıkararak pagerank bilgisini elde edelim. Sonucu labelde gösterelim.
label1.Text = (GooglePageRank.getPageRank(textBox1.Text).ToString()); //butonun Click Olayında yer alacak.
Yukarıdaki metodu kullanarak Toplu PR Hesaplama Programınızı da kolayca yapabilirsiniz.
Uygulamamızda GooglePageRank classını oluşturup aşağıdaki metodları yazalım:
Not: using System.Net; ve using System.IO; namespaceleri baştan ekleyelim. (using System; ve using System.Windows.Forms; zaten mevcut durumda olacak)
private static void Mix(ref uint a, ref uint b, ref uint 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;
}
private static string GoogleChecksum(string url)
{
uint GoogleMagic = 0xE6359A60;
uint a, b;
uint c = GoogleMagic;
a = b = 0x9E3779B9;
int k = 0;
int length = url.Length;
//Algoritma
while (length >= 12)
{
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
b += (uint)(url[k + 4] + (url[k + 5] << 8) + (url[k + 6] << 16) + (url[k + 7] << 24));
c += (uint)(url[k + 8] + (url[k + 9] << 8) + (url[k + 10] << 16) + (url[k + 11] << 24));
Mix(ref a, ref b, ref c);
k += 12;
length -= 12;
}
c += (uint)url.Length;
switch (length)
{
case 11:
c += (uint)(url[k + 10] << 24);
goto case 10;
case 10:
c += (uint)(url[k + 9] << 16);
goto case 9;
case 9:
c += (uint)(url[k + 8] << 8);
goto case 8;
case 8:
b += (uint)(url[k + 7] << 24);
goto case 7;
case 7:
b += (uint)(url[k + 6] << 16);
goto case 6;
case 6:
b += (uint)(url[k + 5] << 8);
goto case 5;
case 5:
b += (uint)(url[k + 4]);
goto case 4;
case 4:
a += (uint)(url[k + 3] << 24);
goto case 3;
case 3:
a += (uint)(url[k + 2] << 16);
goto case 2;
case 2:
a += (uint)(url[k + 1] << 8);
goto case 1;
case 1:
a += (uint)(url[k + 0]);
break;
default:
break;
}
Mix(ref a, ref b, ref c);
return string.Format("6{0}", c);
}
public static int getPageRank(string url)
{
//URL checksum Hesaplama
string checkSum = GoogleChecksum("info:" + url);
string file = "http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=" + checkSum + "&features=Rank&q=info:" + url;
try
{
//Googledan PR verilerini alma
WebRequest request = WebRequest.Create(file);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string data = reader.ReadToEnd();
reader.Close();
response.Close();
//Parse PR from string
int pageRank = -1;
if (data.IndexOf(':') != -1)
{
data = data.Substring(data.LastIndexOf(':') + 1);
}
int.TryParse(data, out pageRank);
return pageRank;
}
catch (Exception)
{
return -1;
}
}
}
Yukarıda Googledan PR verilerini almak için gerekli metodlar classımızın içine yazıldı. Şimdi formumuza bir adet textbox, buton ve label ekleyelim. Ve classımızın getPageRank metodundan instance çıkararak pagerank bilgisini elde edelim. Sonucu labelde gösterelim.
label1.Text = (GooglePageRank.getPageRank(textBox1.Text).ToString()); //butonun Click Olayında yer alacak.
Yukarıdaki metodu kullanarak Toplu PR Hesaplama Programınızı da kolayca yapabilirsiniz.