Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 生成缩短url的代码/算法是什么?_Python 3.x_Algorithm_Hash_Encoding_Short Url - Fatal编程技术网

Python 3.x 生成缩短url的代码/算法是什么?

Python 3.x 生成缩短url的代码/算法是什么?,python-3.x,algorithm,hash,encoding,short-url,Python 3.x,Algorithm,Hash,Encoding,Short Url,我已经搜索了一段时间如何生成一个缩短的url(例如bit.ly或goo.gl的工作方式),但都没有成功 我猜想会是这样的: baseN(hash(long_url)) 但我总是以很长的摘要结束,而不是像6个字符这样的短摘要 在编码之前截断摘要是否安全(编码是否必要?我相信这是为了使其URL“安全”,但我想问一下),并且在仅处理六个字符时是否不存在冲突的可能性 它看起来像(警告:我不懂数学)6的阶乘!(例如,6*5*4*3*2*1)将只产生720个组合 我还记得在某个地方读到过这样一篇文章:用一

我已经搜索了一段时间如何生成一个缩短的url(例如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")

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

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

  • 您可能正在寻找中提到的双向函数

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

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

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


    不,这不是阶乘。这是一个指数。6个位置中的62个不同字符,is 62^6 is 56.800.235.584可能的唯一字符串。URL缩短器不使用散列,他们使用随机数生成器和快速重复检查。当然,从这样的散列中截取任何内容都不省事。。。这就像从电话簿中的每个条目中截取姓氏和街道地址,然后仍然希望“亚当”指的是一个唯一的人…不要再考虑“随机唯一标识符”将需要暗示任何哈希。缩短某个内容,然后从缩短的版本还原原始内容将是一种压缩算法。但是,当您仍然局限于使用ASCII子集来表示压缩值时,这些对短字符串(如URL)不是非常有效