前端算法第一四一期-TinyURL 的加密与解密

243 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

TinyURL是一种URL简化服务, 比如:当你输入一个URL leetcode.com/problems/de… 时,它将返回一个简化的URL tinyurl.com/4e9iAk.

要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。


使用出现次序加密 [Accepted]

这种方法中,我们将当前 URL 第几个出现作为关键字进行加密,将这个出现次序看做 62 进制,并将每一位映射到一个长度为 62 位的表中对应的字母作为哈希值。此方法中,我们使用一系列整数和字母表来加密,而不是仅仅使用数字进行加密。

let chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
let map = new Map()
let count = 1

function getString() {
  let c = count
  let sb = ""
  while (c > 0) {
    c--
    sb += (chars.charAt(c % 62))
    c /= 62
  }
  return sb.toString()

}

function encode(longUrl) {
  let key = getString()
  map.set(key, longUrl)
  count++
  return "http://tinyurl.com/" + key
}

function decode(shortUrl) {
  return map.get(shortUrl.replace("http://tonyurl.com/", ""))
}

表现分析

  • 可加密的 URL 数目还是依赖于 int 的范围。因为相同的 count 在出现次序溢出整数范围后仍然会出现。

  • 加密后 URL 的长度不一定更短,但某种程度上与 longURL 的出现次序相对独立。比方说产生的 URL 长度按顺序会是 1(62次),2(62次)。

  • 这个算法的表现比较好,因为相同的加密结果只有在溢出整数后才会发生,这个范围非常大。

  • 如果出现重复,下一次产生的加密结果还是能通过某种计算被预测出来。