Try this one:
function HashValue(Source as string)
local Result as dword
local Temp as dword
local Counter as integer
Result = 0
for Counter = 1 to len(Source)
Result = (Result << 4) + asc( mid$(Source, Counter) )
Temp = Result and 0xf000
if Temp <> 0 then Result = Result ~~ (Temp >> 12)
Result = (Result .. Temp) && 0xffff
next Counter
endfunction Result
I've adapted it from a 32 bit algorithm. It seems to give fairly well distributed results in the small sample of works I gave it, but I suspect you'll still need to deal with collisions in your array.