How to make unique short URL with Python?

后端 未结 12 1256
渐次进展
渐次进展 2020-12-02 07:02

How can I make unique URL in Python a la http://imgur.com/gM19g or http://tumblr.com/xzh3bi25y When using uuid from python I get a very large one. I want something shorter f

相关标签:
12条回答
  • 2020-12-02 07:57

    You can generate a N random string:

    import string
    import random
    
    def short_random_string(N:int) -> str:
    
        return ''.join(random.SystemRandom().choice(
                        string.ascii_uppercase + \
                        string.ascii_lowercase + \
                        string.digits) for _ in range(N))
    

    so,

    print (short_random_string(10) )
    #'G1ZRbouk2U'
    

    all lowercase

    print (short_random_string(10).lower() )
    #'pljh6kp328'
    
    0 讨论(0)
  • 2020-12-02 07:57

    Try this http://code.google.com/p/tiny4py/ ... It's still under development, but very useful!!

    0 讨论(0)
  • 2020-12-02 07:59

    Hashids is an awesome tool for this.

    Edit:

    Here's how to use Hashids to generate a unique short URL with Python:

    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)
    
    0 讨论(0)
  • 2020-12-02 08:00

    This module will do what you want, guaranteeing that the string is globally unique (it is a UUID):

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

    If you need something shorter, you should be able to truncate it to the desired length and still get something that will reasonably probably avoid clashes.

    0 讨论(0)
  • 2020-12-02 08:04

    My Goal: Generate a unique identifier of a specified fixed length consisting of the characters 0-9 and a-z. For example:

    zcgst5od
    9x2zgn0l
    qa44sp0z
    61vv1nl5
    umpprkbt
    ylg4lmcy
    dec0lu1t
    38mhd8i5
    rx00yf0e
    kc2qdc07
    

    Here's my solution. (Adapted from this answer by kmkaplan.)

    import random
    
    class IDGenerator(object):
        ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz"
    
        def __init__(self, length=8):
            self._alphabet_length = len(self.ALPHABET)
            self._id_length = length
    
        def _encode_int(self, n):
            # Adapted from:
            #   Source: https://stackoverflow.com/a/561809/1497596
            #   Author: https://stackoverflow.com/users/50902/kmkaplan
    
            encoded = ''
            while n > 0:
                n, r = divmod(n, self._alphabet_length)
                encoded = self.ALPHABET[r] + encoded
            return encoded
    
        def generate_id(self):
            """Generate an ID without leading zeros.
    
            For example, for an ID that is eight characters in length, the
            returned values will range from '10000000' to 'zzzzzzzz'.
            """
    
            start = self._alphabet_length**(self._id_length - 1)
            end = self._alphabet_length**self._id_length - 1
            return self._encode_int(random.randint(start, end))
    
    if __name__ == "__main__":
        # Sample usage: Generate ten IDs each eight characters in length.
        idgen = IDGenerator(8)
    
        for i in range(10):
            print idgen.generate_id()
    
    0 讨论(0)
  • 2020-12-02 08:05

    The reason UUIDs are long is because they contain lots of information so that they can be guaranteed to be globally unique.

    If you want something shorter, then you'll need to do something like generate a random string, checking whether it is in the universe of already generated strings, and repeating until you get an unused string. You'll also need to watch out for concurrency here (what if the same string gets generated by a separate process before you inserted into the set of strings?).

    If you need some help generating random strings in Python, this other question might help.

    0 讨论(0)
提交回复
热议问题