PageRank (PR) 是 Google 早期核心演算法,評估網頁重要性 (0-10 級)。雖 Google 2016 年停止公開 Toolbar PR,但演算法邏輯仍具參考價值。
Google 使用特殊雜湊函數生成查詢參數 `ch`,PHP 移植版:
<?php
define('GMAG', 0xE6359A60);
function zeroFill($a, $b) {
$z = 0x80000000;
if ($z & $a) {
$a = ($a >> 1) & (~$z);
$a |= 0x40000000;
$a = $a >> ($b - 1);
} else {
$a = $a >> $b;
}
return $a;
}
function mix(&$a, &$b, &$c) {
$a -= $b; $a -= $c; $a ^= zeroFill($c, 13);
$b -= $c; $b -= $a; $b ^= ($a << 8);
$c -= $a; $c -= $b; $c ^= zeroFill($b, 13);
$a -= $b; $a -= $c; $a ^= zeroFill($c, 12);
$b -= $c; $b -= $a; $b ^= ($a << 16);
$c -= $a; $c -= $b; $c ^= zeroFill($b, 5);
$a -= $b; $a -= $c; $a ^= zeroFill($c, 3);
$b -= $c; $b -= $a; $b ^= ($a << 10);
$c -= $a; $c -= $b; $c ^= zeroFill($b, 15);
}
function GCH($url, $length = null, $init = GMAG) {
if (is_null($length)) $length = count($url);
$a = $b = 0x9E3779B9;
$c = $init;
$k = 0; $len = $length;
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) {
case 11: $c += $url[$k+10]<<24;
case 10: $c += $url[$k+9]<<16;
case 9: $c += $url[$k+8]<<8;
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];
}
mix($a, $b, $c);
return $c;
}
function strord($string) {
$result = [];
for ($i = 0; $i < strlen($string); $i++) $result[] = ord($string[$i]);
return $result;
}
function getPR($url) {
$queryUrl = 'info:' . $url;
$ch = GCH(strord($queryUrl));
$encodedUrl = 'info:' . urlencode($url);
$apiUrl = "https://www.google.com/search?client=navclient-auto&ch=6{$ch}&ie=UTF-8&oe=UTF-8&features=Rank&q={$encodedUrl}";
$response = @file_get_contents($apiUrl);
if ($response === false) return 'N/A';
// 回應格式: Rank_1_1:5
if (preg_match('/Rank_\d+_\d+:(\d+)/', $response, $matches)) {
return (int)$matches[1];
}
return 'N/A';
}
// 使用範例
echo "PR 值: " . getPR('https://www.example.com');
?>
此程式碼展示: