我正在用 Dancer 编写一个非常小的 URL 缩短器。它使用 REST 插件将发布的 URL 存储在数据库中,该数据库包含六个字符串,用户可以使用该字符串来访问短 URL。
现在我对我的随机字符串生成方法有点不确定。
sub generate_random_string{
my $length_of_randomstring = shift; # the length of
# the random string to generate
my @chars=('a'..'z','A'..'Z','0'..'9','_');
my $random_string;
for(1..$length_of_randomstring){
# rand @chars will generate a random
# number between 0 and scalar @chars
$random_string.=$chars[rand @chars];
}
# Start over if the string is already in the Database
generate_random_string(6) if database->quick_select('urls', { shortcut => $random_string });
return $random_string;
}
这会生成一个六个字符的字符串,如果生成的字符串已在数据库中,则递归调用该函数。我知道有 63^6 个可能的字符串,但是如果数据库收集更多条目,这将需要一些时间。也许它会变成一个几乎无限的递归,这是我想阻止的。
有没有办法生成唯一的随机字符串来防止递归?
提前致谢
我们真的不需要对函数将有多少次迭代(或递归)感到手足无措。我相信在每次调用时,预期的迭代次数都是几何分布的(即第一次成功之前的试验次数由几何分布 http://en.wikipedia.org/wiki/Geometric_distribution),其平均值为 1/p,其中 p 是成功找到未使用字符串的概率。我相信 p 只是 1 - n/63^6,其中 n 是当前存储的字符串的数量。因此,我认为在函数每次调用平均递归超过 2 次 (p = .5) 之前,您需要在数据库中存储 300 亿个字符串 (~63^6/2)。
此外,几何分布的方差为 1-p/p^2,因此即使有 300 亿个条目,一个标准差也仅为 sqrt(2)。因此,我预计约 99% 的时间循环将少于 2 + 2*sqrt(2) 迭代或约 5 次迭代。换句话说,我不会太担心它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)