在URL缩短器中使用双射字典

时间:2011-08-21 14:14:17

标签: c# url-shortener

我正在创建一个新的URL缩短器,并且已经读过Bijective函数是必需的。所以,我发现Jon Skeet's BiDictionary(优秀),并想知道如何在URL缩短器应用程序中使用它。目前,我对Base36编码数据库ID列以创建缩短的URL并将完整的URL存储到表中。这工作正常,但我迷失了为什么我需要使用Bijective功能?我是否将数据库中的值存储到双射词典中?我目前有足够的功能吗?使用双射词典有什么好处?

1 个答案:

答案 0 :(得分:2)

不确定我完全理解你的问题......

如果我理解正确,您已创建了一个包含唯一ID和URL的查找表。 您缩短的URL是Base36编码的ID。

让我们看一下用例:

  • 创建缩短的网址
    意味着你在实现中检查表中是否已经有了这个URL(简单,只返回Base36编码的ID) 否则,只需创建一个新条目并返回新ID的Base36编码。

  • 查找完整的网址
    将Base36值解码为ID,在表中查找ID并返回-if found-完整URL。

所以基本上你已经创建了一个双向函数(双向1:1对应) - 只是在两个方向上都能正常工作而没有任何损失,因此对于表中给定的URL完全可逆。 Base36编码/解码也是完全可逆的,所以它也是一个双射函数: - )

你提到的Jon的BiDictionary将是内存缓存的良好基础(推荐直写),因此你可以尽可能避免数据库往返。 Bidictionary使用Dictionary,而对于可由多个线程访问的缓存,我强烈建议使用ConcurrentDictionary。在你的情况下,不需要Jon的实现中的List<>部分,因为你总是会有1:1的对应关系。为了更快的查找,您可以使用Base36编码的值作为键...