Citat:
Originally posted by Jan Eriksson@Aug 3 2006, 22:06
Koden finns lite överallt på nätet
|
Ja, det verkar som det är samma kodsnutt som är inbyggd i alla skript som har länkats här. Det verkar i alla fall komma från ett perl-skript från början...
http://www.everyscript.de/PRank.htm
För den som är intresserad, för att räkna ut checksummen går det till som följer (i något komprimerad/optimerad form) med php:
Kod:
function uShiftRight($x,$y){
if(0x80000000&$x) return ($x>>1 & 0x7FFFFFFF | 0x40000000) >> --$y; else return $x >> $y;
}
function urlCheckSum($url) {
$shifts = array(13,8,13,12,16,5,3,10,15);
$a = $b = 0x9E3779B9;
$c = 0xE6359A60;
$k = 0;
$len=strlen($url);
while($len>=12){
$a += ord($url{$k++}) + (ord($url{$k++})<<8) + (ord($url{$k++})<<16) + (ord($url{$k++})<<24);
$b += ord($url{$k++}) + (ord($url{$k++})<<8) + (ord($url{$k++})<<16) + (ord($url{$k++})<<24);
$c += ord($url{$k++}) + (ord($url{$k++})<<8) + (ord($url{$k++})<<16) + (ord($url{$k++})<<24);
$n=0;
while($n<9) {
$a = ($a-$b-$c) ^ uShiftRight($c,$shifts[$n++]);
$b = ($b-$a-$c) ^ $a<<$shifts[$n++];
$c = ($c-$a-$b) ^ uShiftRight($b,$shifts[$n++]);
}
$len -= 12;
}
$c += strlen($url);
switch($len){
case 11: $c += ord($url{$k+10}) << 24;
case 10: $c += ord($url{$k+9}) << 16;
case 9: $c += ord($url{$k+8}) << 8;
case 8: $b += ord($url{$k+7}) << 24;
case 7: $b += ord($url{$k+6}) << 16;
case 6: $b += ord($url{$k+5}) << 8;
case 5: $b += ord($url{$k+4});
case 4: $a += ord($url{$k+3}) << 24;
case 3: $a += ord($url{$k+2}) << 16;
case 2: $a += ord($url{$k+1}) << 8;
case 1: $a += ord($url{$k});
}
$n=0;
while($n<9) {
$a = ($a-$b-$c) ^ uShiftRight($c,$shifts[$n++]);
$b = ($b-$a-$c) ^ $a<<$shifts[$n++];
$c = ($c-$a-$b) ^ uShiftRight($b,$shifts[$n++]);
}
return sprintf("6%u",$c);
}
Det är bara att kalla
urlCheckSum() med domännamnet.