\ Filename : pagerank.4th
\ Description : Google PageRank Checksum Algorithm
\ C author : http://zhiwei.li/
\ C version : 2008-08-20
\ 4tH author : J.L. Bezemer
\ 4tH version : 2008-11-18
: ConvertStrToInt ( a n1 n2 n3 -- n4)
swap 2swap bounds ?do over * i c@ + loop nip
;
[hex]
: HashURL ( a n1 -- n2)
2dup 01505 021 ConvertStrToInt 02 rshift >r
00 01003f ConvertStrToInt
r@ 04 rshift 03ffffc0 and r> 03f and or >r
r@ 04 rshift 03ffc00 and r> 03ff and or >r
r@ 04 rshift 03c000 and r> 03fff and or >r
r@ 03c0 and 04 lshift
r@ 03c and or
02 lshift over 0f0f and or swap
r@ -04000 and 04 lshift
r> 03c00 and or
0a lshift swap 0f0f0000 and or or
;
[decimal]
: CheckHash ( n -- c)
false 0 >r >r
begin
10 /mod swap r@
if 2* 10 /mod + then
r> 0= r> rot + >r >r
dup 0=
until
drop r> r>
10 mod dup 0<>
if 10 swap - over
if dup 2 mod 1 =
if 9 + then
1 rshift
then
then
48 + nip
;
s" http://www.xs4all.nl" .( Checksum=) HashURL dup CheckHash
char 7 emit emit . cr
|