C# 在URL缩写器中使用双射词典

C# 在URL缩写器中使用双射词典,c#,url-shortener,C#,Url Shortener,我正在创建一个新的URL缩短器,并且已经了解到需要一个双射函数。因此,我发现(非常好),并想知道如何在URL shortener应用程序中使用它。目前,我对数据库ID列进行Base36编码,以创建缩短的URL,并将完整的URL存储到表中。这很好,但我不明白为什么我需要使用双射函数?我是否将数据库中的值存储到双射字典中?我目前拥有的功能是否足够?使用双射词词典有什么好处?我不确定我是否完全理解你的问题… 如果我理解正确,您已经创建了一个具有唯一ID和URL的查找表。 缩短的URL是Base36编码

我正在创建一个新的URL缩短器,并且已经了解到需要一个双射函数。因此,我发现(非常好),并想知道如何在URL shortener应用程序中使用它。目前,我对数据库ID列进行Base36编码,以创建缩短的URL,并将完整的URL存储到表中。这很好,但我不明白为什么我需要使用双射函数?我是否将数据库中的值存储到双射字典中?我目前拥有的功能是否足够?使用双射词词典有什么好处?

我不确定我是否完全理解你的问题…

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

让我们看看用例:

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

  • 查找完整的URL
    将Base36值解码为一个ID,在表中查找该ID并返回完整的URL(如果找到)

因此,基本上您已经创建了一个双射函数(一个双向1:1对应关系)——它可以在两个方向上工作,不会有任何损失,因此对于表中给定的URL是完全可逆的。Base36编码/解码也是完全可逆的,因此也是一个双射函数:-)


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

您在哪里读到需要双射函数?谢谢-我读了很多关于双射函数的书,认为我遗漏了一些东西。这正是我需要的澄清。