There are a large number of hashing algorithms you could use. Most of them work better in C / C++ than Perl, however, since you really need unsigned numbers, and there doesn't seem to be a simple way to tell Perl you don't want a signed variable.
The following should work ok for strings of more than a few characters:
use strict;
use warnings;
print hash('dfsdgogmoerigre');
BEGIN {
my @c = (0..9, 'A'..'F');
my $c = $#c + 1;
sub hash {
my ($n, $r) = 0;
for (split //, $_[0]) {
$n = ord($_) + ($n << 6) + ($n << 16) - $n;
}
$n = abs($n);
while ($n >= $c) {
$r .= $c[$n % $c];
$n /= $c;
}
return $r;
}
}