0

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

4

1 回答 1

2

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

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

让我们看一下用例:

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

  • 查找完整 URL
    将 Base36 值解码为 ID,在表中查找 ID 并返回 - 如果找到 - 完整 URL。

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

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

于 2011-08-21T14:27:53.903 回答