使用intval和base_convert创建短链接

时间:2015-12-31 04:45:31

标签: php

我发现了一个关于制作像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;结果,但它们都是一样的......

2 个答案:

答案 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