我正在创建一个新的URL缩短程序,并已阅读到,双射函数是什么是必需的。因此,我找到了Jon Skeet's BiDictionary (非常棒),并想知道如何在URL shortener应用程序中使用它。目前,我对数据库ID列进行Base36编码,以创建我的缩短URL,并将完整的URL存储到表中。这很好用,但是我不知道为什么我需要使用双射函数?我是否将数据库中的值存储到双射字典中?我目前拥有的功能足够了吗?使用双射字典有什么好处?
发布于 2011-08-21 22:27:54
我不太确定我是否完全理解你的问题...
如果我理解正确的话,您已经创建了一个具有唯一ID和URL的查找表。您的网址缩写是Base36编码的ID。
让我们看一下用例:
这意味着在您的实现中,检查表中是否已经有该URL (简单地说,只返回Base36编码的ID)。
否则,只需创建一个新条目并返回新ID的Base36编码。
将URL值解码为ID,在表中查找ID并返回-if found-完整的Base36。
因此,基本上你已经创建了一个双射函数(双向1:1对应)-只是在两个方向上都没有任何损失的东西,因此对于表中给定的URL是完全可逆的。Base36编码/解码也是完全可逆的,所以这也是一个双射函数:-)
您提到的来自Jon的BiDictionary将是内存缓存(推荐写通式)的良好基础,因此您可以尽可能避免DB往返。Bidictionary使用Dictionary,而对于可以由多个线程访问的缓存,我强烈建议使用ConcurrentDictionary。在您的示例中,不需要来自Jon实现的List<>部分,因为您将始终具有1:1的对应关系。为了更快地查找,您可以使用Base36编码值作为键...
https://stackoverflow.com/questions/7138758
复制相似问题