我编写了一个PHP编码/解码双射函数,只需要一个数字,然后用 base-58 用自定义字母表对其进行编码/解码。
此缩短版工作正常,但我希望能够限制某些字词,并且能够创建自定义虚荣网址。
这应该意味着用户不会将他们的链接重新加入 domain.com/ 胸部或其他东西。
此外,我希望能够 domain.com/stackoverflow 解析 domain.com/12342 ,而不会破坏双效功能。
建议的解决方案
我有几个建议,但它们似乎不是最佳的。我想到的一种方法是将自定义网址存储在数据库中,以便1234 => mycoolurl然后编码/解码,查找它是否已经存在。如果确实如此,将数字偏移10,000,000(因此它将变为10,001,234然后对其进行编码/解码。这使得某些链接比其他链接长得多,并设置10,000,000个链接的硬限制(这几乎没问题,但仍然不是很优雅)为了解决诅咒词问题,我可以在数据库中插入虚拟链接。
我很想听听你的意见!
答案 0 :(得分:0)
我认为双向功能只是缩短的一部分,你的两个问题都超出了职能的责任范围。
我认为你可以通过从自定义字母表中排除所有元音来解决诅咒词问题(从而将base-58更改为base-48并牺牲URL的简洁性),但这可能是你在函数内部所能做到的。
如果我们将缩短算法作为一个整体,假设最明显的变体,使用键值表(或其他存储):
然后通过针对停用词/正则表列表检查结果路径并在匹配时重新生成随机数,可以轻松解决诅咒词问题。
对于虚荣URL,这可以通过将双向函数应用于所需路径来获得密钥号并在步骤2中使用而不是随机数来解决,除非我遗漏了某些内容。当然,您应该为可能的冲突做好准备,或者将虚荣短URL列表保留为domain.com/reserved之类的内容。另外,要获得足够长的虚荣词,你显然需要一个足够大的密钥空间 - 对于4字节的整数,你最多可以得到5个字符。
另一种选择是从缩短词中删除虚荣词(通过将它们添加到停止列表中)并实现单独的别名功能,该功能不使用双向功能但仅存储(虚URL,短URL)对。