【发布时间】: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