如何使用Python制作独特的短URL?

Est*_*man 34 python url uuid tinyurl short-url

我怎样才能在Python中创建独特的URL http://imgur.com/gM19ghttp://tumblr.com/xzh3bi25y 当使用python中的uuid时,我会得到一个非常大的URL .我想要更短的URL.

Fog*_*ird 23

编辑:在这里,我为你写了一个模块.用它.http://code.activestate.com/recipes/576918/


从1开始计数将保证简短,唯一的URL./ 1,/ 2,/ 3 ...等

在字母表中添加大写和小写字母将提供您问题中的URL.而你只是计算基数为62而不是基数为10.

现在唯一的问题是网址是连续出现的.要解决这个问题,请在此处阅读我对此问题的回答:

将递增的整数范围映射到最大六位数26,但不可预测

基本上,该方法是简单地在递增值中交换位以给出随机性的外观,同时保持确定性并保证您没有任何冲突.


Ned*_*der 17

我不确定大多数URL缩短程序是否使用随机字符串.我的印象是他们将URL写入数据库,然后使用新记录的整数ID作为短URL,编码基数为36或62(字母+数字).

将int转换为任意基础的字符串的Python代码就在这里.


小智 6

Python 的short_url很棒。

下面是一个例子:

import short_url

id = 20  # your object id
domain = 'mytiny.domain' 

shortened_url = "http://{}/{}".format(
                                     domain,
                                     short_url.encode_url(id)
                               )
Run Code Online (Sandbox Code Playgroud)

并解码代码:

decoded_id = short_url.decode_url(param)
Run Code Online (Sandbox Code Playgroud)

就是这样 :)

希望这会有所帮助。


Sta*_*kis 5

此模块将执行您想要的操作,保证字符串是全局唯一的(它是UUID):

http://pypi.python.org/pypi/shortuuid/0.1

如果你需要更短的东西,你应该能够将它截断到所需的长度,并且仍能获得可以合理地避免冲突的东西.


ynd*_*lok 5

Hashids是一个很棒的工具。

编辑:

以下是如何使用 Hashids 通过 Python 生成唯一的短 URL:

from hashids import Hashids

pk = 123 # Your object's id
domain = 'imgur.com' # Your domain

hashids = Hashids(salt='this is my salt', min_length=6)
link_id = hashids.encode(pk)
url = 'http://{domain}/{link_id}'.format(domain=domain, link_id=link_id)
Run Code Online (Sandbox Code Playgroud)


Ami*_*thi 5

这个答案来得很晚,但当我计划创建一个 URL 缩短器项目时,我偶然发现了这个问题。现在我已经实现了一个功能齐全的 URL 缩短器(源代码在amitt0​​01/pygmy),我在这里为其他人添加一个答案。

任何 URL 缩短器背后的基本原理是从长 URL 获取一个 int,然后使用 base62(base32, etc) 编码将此 int 转换为更易读的短 URL。

这个int是如何产生的?

大多数 URL 缩短器使用一些自动增量数据存储将 URL 添加到数据存储并使用自动增量 id 获取 int 的 base62 编码。

字符串程序中的 base62 编码示例:

# Base-62 hash

import string
import time

_BASE = 62


class HashDigest:
    """Base base 62 hash library."""

    def __init__(self):
        self.base = string.ascii_letters + string.digits
        self.short_str = ''

    def encode(self, j):
        """Returns the repeated div mod of the number.
        :param j: int
        :return: list
        """
        if j == 0:
            return [j]
        r = []
        dividend = j
        while dividend > 0:
            dividend, remainder = divmod(dividend, _BASE)
            r.append(remainder)
        r = list(reversed(r))
        return r

    def shorten(self, i):
        """
        :param i:
        :return: str
        """
        self.short_str = ""
        encoded_list = self.encode(i)
        for val in encoded_list:
            self.short_str += self.base[val]
        return self.short_str
Run Code Online (Sandbox Code Playgroud)

这只是显示 base62 编码的部分代码。在core/hashdigest.py查看完整的 base62 编码/解码代码

此答案中的所有链接均从我创建的项目中缩短


Dom*_*ger 2

UUID之所以长,是因为它们包含大量信息,这样可以保证它们是全局唯一的。

如果你想要更短的东西,那么你需要做一些事情,比如生成一个随机字符串,检查它是否在已经生成的字符串的范围内,然后重复直到得到一个未使用的字符串。您还需要注意此处的并发性(如果在插入字符串集之前由单独的进程生成相同的字符串怎么办?)。

如果您需要一些在 Python 中生成随机字符串的帮助,这个其他问题可能会有所帮助。