如何在Python中将整数转换为最短的url安全字符串?

发布于 2021-01-29 19:36:55

我想以最短的方式表示URL中的整数。例如,可以使用十六进制将11234缩短为“
2be2”。由于base64使用的是64个字符的编码,因此应该有可能使用比十六进制更少的字符来表示base64中的整数。问题是我不知道使用Python将整数转换为base64(然后再转换回)的最干净方法。

base64模块具有处理字节串的方法-因此,也许一种解决方案是将整数转换为Python字符串的二进制表示形式…但是我也不知道该怎么做。

关注者
0
被浏览
74
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这个答案在本质上与道格拉斯·里德(Douglas Leeder)的相似,但有以下变化:

    • 它不使用实际的Base64,因此没有填充字符
    • 它没有将数字先转换为字节字符串(以256为基数),而是将其直接转换为以64为基数,这具有使您可以使用符号字符来表示负数的优点。
            import string
        ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
                   string.digits + '-_'
        ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
        BASE = len(ALPHABET)
        SIGN_CHARACTER = '$'
    
        def num_encode(n):
            if n < 0:
                return SIGN_CHARACTER + num_encode(-n)
            s = []
            while True:
                n, r = divmod(n, BASE)
                s.append(ALPHABET[r])
                if n == 0: break
            return ''.join(reversed(s))
    
        def num_decode(s):
            if s[0] == SIGN_CHARACTER:
                return -num_decode(s[1:])
            n = 0
            for c in s:
                n = n * BASE + ALPHABET_REVERSE[c]
            return n
    

        >>> num_encode(0)
        'A'
        >>> num_encode(64)
        'BA'
        >>> num_encode(-(64**5-1))
        '$_____'
    

    一些注意事项:

    • 您可以(以 微不足道的方式 )通过将string.digits放在字母表的首位(并使符号字符为“-”)来提高64位基数的可读性。我根据Python的urlsafe_b64encode选择了执行的顺序。
    • 如果要编码很多负数,则可以使用符号位或一个/两个补码代替符号字符来提高效率。
    • 通过更改字母,您应该能够轻松地使此代码适应不同的基础,将其限制为仅字母数字字符或添加其他“ URL安全”字符。
    • 我建议 不要 在大多数情况下在URI中使用除base 10以外的表示形式-与HTTP的开销相比,它增加了复杂性并使调试更加困难而又没有大量的节省-除非您要使用TinyURL式的外观。


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看