0

我编写了一个 PHP 编码/解码双射函数,它只需要一个数字并使用带有自定义字母的base-58对其进行编码/解码。

这个缩短器工作正常,但我希望能够限制某些单词并能够创建自定义虚荣网址

这应该意味着用户不会将他们的链接重新添加到domain.com/boobs或其他内容。

此外,我希望能够在不破坏双射函数的情况下将domain.com/stackoverflow解析为domain.com/12342 。

提议的解决方案

我有几个建议,但它们似乎并不理想。我想到的一种方法是将自定义 url 存储在数据库中,因此 1234 => mycoolurl 然后在编码/解码时查找它是否已经存在。如果是这样,则将数字偏移 10,000,000(因此它将变为 10,001,234,然后对其进行编码/解码。这会使某些链接比其他链接长得多,并将硬限制设置为 10,000,000 个链接(这实际上可以,但仍然不是很优雅). 为了解决脏话问题,我可以在数据库中插入虚拟链接。

我很想听听你的意见!

4

1 回答 1

0

在我看来,双射函数只是缩短器的一部分,您的两个问题都不属于该函数的职责。

我认为您可以通过从您的自定义字母表中排除所有元音来解决诅咒词问题(从而将 base-58 更改为 base-48 并牺牲 URL 的简短性),但这可能是您在函数本身中所能做的所有事情。

如果我们将缩短算法作为一个整体,假设最明显的变体,使用键值表(或其他存储):

  1. 获取传入的 URL
  2. 生成随机密钥号,检查存储是否已使用,如果需要重新生成并重复
  3. 将密钥和传入 URL 存储在存储中
  4. 应用双射函数获取短 URL 路径

然后通过根据停用词/正则表达式列表检查生成的路径并在匹配时重新生成随机数,可以轻松解决诅咒词问题。

至于虚 URL,这可以通过将双射函数应用于所需路径以获取密钥号并在步骤 2 中使用它而不是随机数来解决,除非我遗漏了什么。当然,您应该为可能的冲突做好准备,或者将虚短 URL 列表预先保留到 domain.com/reserved 之类的内容中。此外,要获得足够长的虚荣词,您显然需要足够大的密钥空间 - 对于 4 字节整数,您最多可以获得 5 个字符。

另一种选择是从缩短器中删除虚词(通过将它们添加到停止列表中)并实现不使用双射函数但仅存储(虚 URL、短 URL)对的单独别名函数。

于 2014-04-03T11:35:11.773 回答