【问题标题】:What is the code/algorithm for generating a shortened url?生成缩短网址的代码/算法是什么?
【发布时间】:2018-08-29 00:32:24
【问题描述】:

我已经搜索了一段时间关于如何生成缩短的网址(例如 bit.ly 或 goo.gl 的工作原理),但没有成功。

我猜应该是这样的:

baseN(hash(long_url))

但我总是得到一个很长的摘要,而不是像 6 个字符这样的简短摘要。

在编码之前截断摘要是否安全(甚至有必要对其进行编码 - 我相信它是为了使其 URL '安全'但想问一下)并且只处理六个时是否没有发生冲突的可能性字符?

看起来(警告:我不懂数学)是 6 的阶乘! (例如6*5*4*3*2*1)只会产生 720 种组合。

我还记得在某处读到过一个包含 10 万个项目的哈希表,粗略计算碰撞次数可能会产生约 17% 的碰撞几率。这对我来说是一个相当大的比例?

以下 Python 代码基于我对如何进行这种类型的 url 缩短的理解:

import hashlib, base64

message = hashlib.sha512()
message.update("https://www.python.org/dev/peps/pep-0537/")

base64.urlsafe_b64encode(
    message.hexdigest().encode("utf-8")
)[:6].decode("utf-8")

【问题讨论】:

  • 不,这不是阶乘。它是一个指数。 6 个位置的 62 个不同字符,即 62^6 是 56.800.235.584 个可能的唯一字符串。 URL 缩短器不使用散列,它们使用随机数生成器和快速重复检查。
  • 当然,从这样的哈希中截断任何内容并不能保存...这就像从电话簿中的每个条目中截断姓氏和街道地址,并且仍然期望“亚当”指代之后一个唯一的人......不要认为“随机唯一标识符”需要暗示任何散列。
  • 要缩短一些东西然后从缩短的版本中恢复原件将是一个压缩算法。但是,当您仍然局限于使用 ASCII 子集表达压缩值时,这些对 URL 等短字符串并不是很有效。

标签: python-3.x algorithm hash encoding short-url


【解决方案1】:

没有有效的功能可以做到这一点。您需要:

  1. 将 URL 存储在数据库中
  2. 生成唯一 ID(或者如果您已经拥有该 url,请重新使用该 ID)

【讨论】:

    【解决方案2】:

    您可能正在寻找How to code a URL shortener? 中提到的双向功能

    但我也建议您不要过于复杂,除非它确实是您的场景的要求

    一个更简单的方法是只记录您映射的内容:

    ... 没有压缩算法,但是有查找和生成算法。当 URL 缩短器获得一个新 URL 时,它必须创建一个尚未使用的新短 URL 并将其返回。然后它将短 URL 和长 URL 存储在键值存储中,并在查找时使用它。

    https://www.quora.com/What-are-the-http-bit-ly-and-t-co-shortening-algorithms

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2011-06-08
      • 2019-08-30
      • 2012-12-07
      相关资源
      最近更新 更多