Подтвердить что ты не робот

Шифрование базы Python 36

Как я могу закодировать целое число с базой 36 в Python и затем снова декодировать его?

4b9b3361

Ответ 1

Вы пробовали код образца Википедии?

def base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
    """Converts an integer to a base36 string."""
    if not isinstance(number, (int, long)):
        raise TypeError('number must be an integer')

    base36 = ''
    sign = ''

    if number < 0:
        sign = '-'
        number = -number

    if 0 <= number < len(alphabet):
        return sign + alphabet[number]

    while number != 0:
        number, i = divmod(number, len(alphabet))
        base36 = alphabet[i] + base36

    return sign + base36

def base36decode(number):
    return int(number, 36)

print base36encode(1412823931503067241)
print base36decode('AQF8AA0006EH')

Ответ 2

Хотелось бы, чтобы я прочитал это раньше. Вот ответ:

def base36encode(number):
    if not isinstance(number, (int, long)):
        raise TypeError('number must be an integer')
    if number < 0:
        raise ValueError('number must be positive')

    alphabet, base36 = ['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '']

    while number:
        number, i = divmod(number, 36)
        base36 = alphabet[i] + base36

    return base36 or alphabet[0]


def base36decode(number):
    return int(number, 36)

print(base36encode(1412823931503067241))
print(base36decode('AQF8AA0006EH'))

Ответ 3

from numpy import base_repr

num = base_repr(num, 36)
num = int(num, 36)

Вот информация о numpy.base_repr.

Ответ 4

ужасный ответ, но я просто играл с этой мыслью, которой я бы поделился.

import string, math

int2base = lambda a, b: ''.join(
    [(string.digits +
      string.ascii_lowercase +
      string.ascii_uppercase)[(a // b ** i) % b]
     for i in range(int(math.log(a, b)), -1, -1)]
)

num = 1412823931503067241
test = int2base(num, 36)
test2 = int(test, 36)
print test2 == num

Ответ 5

Вы можете использовать numpy base_repr(...) для этого.

import numpy as np

num = 2017

num = np.base_repr(num, 36)
print(num)  # 1K1

num = int(num, 36)
print(num)  # 2017

Вот некоторая информация о numpy, int(x, base=10) и np.base_repr(number, base=2, padding=0).

(Этот ответ первоначально был представлен в виде правки для ответа @christopher-beland, но был отклонен в пользу своего собственного ответа.)

Ответ 6

Вы можете использовать https://github.com/tonyseek/python-base36.

$ pip install base36

а потом

>>> import base36
>>> assert base36.dumps(19930503) == 'bv6h3'
>>> assert base36.loads('bv6h3') == 19930503

Ответ 7

Это работает, если вы заботитесь только о положительных целых числах.

def int_to_base36(num):
    """Converts a positive integer into a base36 string."""
    assert num >= 0
    digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    res = ''
    while not res or num > 0:
        num, i = divmod(num, 36)
        res = digits[i] + res
    return res

Чтобы преобразовать обратно в int, просто используйте int(num, 36). Для преобразования произвольных оснований см. https://gist.github.com/mbarkhau/1b918cb3b4a2bdaf841c

Ответ 8

Я сравнил пример кодировщиков, представленных в ответах на этот вопрос. На моем ноутбуке с Ubuntu 18.10, Python 3.7, Jupyter, магической командой %%timeit и целым числом 4242424242424242 в качестве входных данных я получил следующие результаты:

  • Пример кода Википедии: 4,87 мкс ± 300 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов в каждом)
  • @mistero base36encode(): 3,62 мкс ± 44,2 нс на цикл
  • @user1036542 int2base: 10 мкс ± 400 нс на цикл (после исправления совместимости с py37)
  • @mbarkhau int_to_base36(): 3,83 мкс ± 28,8 нс на цикл

Все сроки были средними ± стандартными. девиация из 7 прогонов, 100000 петель каждый.