如何反转此散列函数?

时间:2016-03-05 13:16:45

标签: perl

这个想法是得到产生这个数字的7个字符长的字符串:3552907293224这个脚本:

sub hash {
     my $nr = 13;
     for (split //, shift) {
          $nr = $nr * 43 + index("acdegijmnoprstuw", $_);
     }
     return $nr;
}

我设法弄清楚它是“eddigjo”的字符串(手动尝试),但是我需要一个能够反转跟踪可能产生上述数字的函数的函数。

1 个答案:

答案 0 :(得分:3)

即使您没有付出任何努力来解决问题,我也会咬人:

use strict;
use warnings;

use feature qw(say);

my @alphabet = split //, "acdegijmnoprstuw";   #/
sub reverse_hash {
    my ($n) = @_;

    my @letters;
    while ( $n > 43 ) {
        unshift @letters, $alphabet[$n % 43];
        $n /= 43;
    }

    return join '', @letters;
}

say reverse_hash(3552907293224);
# eddigjo