Fixed #23399 -- Optimized django.utils.http.int_to_bas36()
Thanks liminspace for the patch and Keryn Knight for benchmarking.
This commit is contained in:
parent
5cba975d26
commit
2508be35ca
|
@ -189,8 +189,7 @@ def int_to_base36(i):
|
|||
"""
|
||||
Converts an integer to a base36 string
|
||||
"""
|
||||
digits = "0123456789abcdefghijklmnopqrstuvwxyz"
|
||||
factor = 0
|
||||
char_set = '0123456789abcdefghijklmnopqrstuvwxyz'
|
||||
if i < 0:
|
||||
raise ValueError("Negative base36 conversion input.")
|
||||
if six.PY2:
|
||||
|
@ -198,20 +197,13 @@ def int_to_base36(i):
|
|||
raise TypeError("Non-integer base36 conversion input.")
|
||||
if i > sys.maxint:
|
||||
raise ValueError("Base36 conversion input too large.")
|
||||
# Find starting factor
|
||||
while True:
|
||||
factor += 1
|
||||
if i < 36 ** factor:
|
||||
factor -= 1
|
||||
break
|
||||
base36 = []
|
||||
# Construct base36 representation
|
||||
while factor >= 0:
|
||||
j = 36 ** factor
|
||||
base36.append(digits[i // j])
|
||||
i = i % j
|
||||
factor -= 1
|
||||
return ''.join(base36)
|
||||
if i < 36:
|
||||
return char_set[i]
|
||||
b36 = ''
|
||||
while i != 0:
|
||||
i, n = divmod(i, 36)
|
||||
b36 = char_set[n] + b36
|
||||
return b36
|
||||
|
||||
|
||||
def urlsafe_base64_encode(s):
|
||||
|
|
Loading…
Reference in New Issue