Home >Backend Development >Python Tutorial >Short URL generation conversion

Short URL generation conversion

巴扎黑
巴扎黑Original
2016-12-09 14:43:421267browse

Main logic:

1, determine a string LS including uppercase and lowercase letters and data, with a length of L = 26+26+10 = 62

2, initialize L**N integers, and push them as a sequence In redis

3, when you need to convert a long URL, first randomly pop out an integer I

4 from the above sequence, take the modulo of the integer I (the divisor is L), the remainder corresponds to a letter of LS, take After the modulus is completed, divide by L and round. When the result is equal to 0, stop modulo division, otherwise the result will continue to be modulo.

5, arrange the letters corresponding to all remainders in order to get a short string SS

6, use the md5 hash value of the long URL as KEY, use the string SS as VALUE, write it into redis

7, String SS as KEY, long URL as VALUE, write to redis

8, add prefix (short URL domain name) to string SS, return as short URL result

9, when the user uses short URL to access, will Take out the string SS in the short URL and use it as KEY to take out the long URL from redis and jump to the long URL

Note:

When the sequence numbers in redis are almost used up, increase them in time (you can write a script to monitor at any time, The quantity will be automatically increased when the quantity is less than 10%), do not save numbers that have been used

#encoding=utf-8
import string
import redis
import hashlib
LETTERS = string.digits + string.ascii_letters
LETTERS_NUM = len(LETTERS)
COUNTER_KEY = 'url:counter'
def init(rd,num):
    for i in xrange(LETTERS_NUM * num):
        rd.sadd('url:id:set',i)
#通过urlid取得短url对应的字符串
def get_url(urlid):
        result = []
        q = urlid/LETTERS_NUM
        r = urlid%LETTERS_NUM
        result.append(LETTERS[r])
        while q:
            r = q%LETTERS_NUM
            q = q/LETTERS_NUM
            result = [LETTERS[r]] + result
        return ''.join(result)
#得到短url字符串
def parse_url(rd, longurl):
    ret = longurl
    if (longurl.startswith("http://") or longurl.startswith("https://")) and len(longurl)>7: 
        m = hashlib.md5()
        m.update(longurl)
        urlkey = m.digest()
        old_param = rd.get(urlkey)
        if old_param:                 
            ret = old_param
        else:
            urlid = int(rd.spop('url:id:set'))
            param = get_url(urlid)
            rd.incr(COUNTER_KEY, 1)
            rd.set(param,longurl)
            rd.set(urlkey,param)
            ret = param    
    print "short url:",ret
    return ret
if __name__ == "__main__":
    url = "http://www.google.com/"
    rd = redis.Redis('127.0.0.1',6379,db=0)
    init(rd,3)
    parse_url(rd,url)





Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn