【发布时间】:2011-02-01 10:18:43
【问题描述】:
我发现Marcel Jackwerth's 对How to code a URL shortener? 的响应可以很好地解决这个问题,但是我的问题是它在 PHP 中的外观如何?这里是Marcel's answer:
你需要一个Bijective Functionf(必须没有x1 != x2,这将是f(x1) = f(x2);对于每个y,你都会找到一个x,这样f(x)=y)。这是必要的,这样您就可以为您的 f(123)='abc' 函数找到一个反函数 g('abc') = 123。
我会继续您的“将数字转换为字符串”的方法(但是,如果您的 id 是 素数 并且大于 52,您会意识到您的建议算法会失败)。
如何将id 转换为短网址:
- 想一想您要使用的字母表。在您的情况下,这是 [a-zA-Z0-9]。它包含 62 个字母。
- 获取自动生成的唯一数字键(自动递增
id):例如 125(十进制数) - 现在您必须将 125(以 10 为底)转换为 X(以 62 为底)。这将是 {2}{1} (2×62+1=125)。
- 现在将符号 {2} 和 {1} 映射到您的字母表。说 {0} = 'a'、{25} = 'z' 等等。我们将有 {2} = 'c' 和 {1} = 'b'。所以 '/cb' 将是您缩短的网址。
如何将缩短的 url abc 解析为初始的 id:
- 如果你想反过来做,也不是很困难。 'e9a' 将被解析为“字母表中的第 4、61、0 个字母” = {4}{61}{0},即 4×62×62 + 61×62 + 0 = 19158。然后你只需要使用
id19158 查找您的数据库记录。
【问题讨论】: