我发现了一个关于制作像TinyURL(https://stackoverflow.com/a/960364/1778465)这样的短代码的问题,而且我不确定我所做的是否正在发挥作用。
我有以下测试代码:
<?php
$val = intval('murwaresuperchainreaction', 36);
echo $val."\n";
echo base_convert($val, 10, 36) . "\n";
echo "---\n";
$val = intval('murwarebarnstormers', 36);
echo $val."\n";
echo base_convert($val, 10, 36) . "\n";
echo "---\n";
$val = intval('murwarenightmare', 36);
echo $val."\n";
echo base_convert($val, 10, 36) . "\n";
我得到了这些结果:
9223372036854775807
1y2p0ij32e8e7
---
9223372036854775807
1y2p0ij32e8e7
---
9223372036854775807
1y2p0ij32e8e7
我的问题是,为什么所有结果都一样?根据我上面提到的答案,我应该得到&#34;防碰撞&#34;结果,但它们都是一样的......
答案 0 :(得分:0)
根据intval
的{{3}},
最大值取决于系统。 32位系统的最大有符号整数范围为-2147483648到2147483647.因此,例如在这样的系统上,intval(&#39; 1000000000000&#39;)将返回2147483647.64位系统的最大有符号整数值为9223372036854775807。
当您使用较短的字符串尝试此方法时,您将获得无冲突的结果。但是大字符串将返回最大值。因此,此方法不适合从大字符串创建短代码。
答案 1 :(得分:0)
您链接的答案中编码的值是一个整数 - 一个引用该缩短链接记录的ID。通过Base 64或Base 36对ID进行编码,字符串变得短得多:
echo base_convert(1234567, 10, 36);
// output qglj
然后可以使用 intval
将缩短的字符串转换回ID:
echo intval('qglj', 36);
// output 1234567