База конвертировать в Python с учетом строки

В PHP задано строковое значение (целые числа, разделенные символами), мы можем вычислить его целочисленное представление:

$hashable = "123A123"; // notice "A" delim
$hash_int = base_convert($hashable, 11, 10);
echo $hash_int;

Выход

2151042

Это полезно, потому что результат уникален для огромного диапазона строк (конечно, коротких). Я использую его для генерации идентификатора в моем приложении.

Как мы можем сделать те же преобразования в Python? Можно ли генерировать одинаковые целые числа для одинаковых строк как в PHP, так и в Python?

Может быть, сначала нам нужно взять хэш int из hashable строка а затем преобразовать базу целых чисел, но как именно мы это делаем?

3

Решение

Ранее предложенный метод завершится неудачно для двоичного и многих других преобразований, он будет идти от любой базы от 2 до 36 и возвращать 0 для недопустимых строк согласно реализация PHP, Реализация php не игнорирует буквы в выводе, если вы не дадите неверный ввод для базы, а затем попытается найти только цифры и преобразовать, так что вы также не сможете вернуть int как можете и получите буквы в выводе:

def to_base(n, bse):
digs = "0123456789abcdefghijklmnopqrstuvwxyz"tmp = []
while n:
n, i = divmod(n, bse)
tmp.append(digs[i])
return "".join(tmp[::-1])



def chng_frm_base(s, frm_bse, to_bse):
if to_bse < 2 or to_bse > 36 or frm_bse < 2 or frm_bse > 36:
raise ValueError("bases must be between 2-36")
try:
return to_base(int(s, frm_bse), to_bse)
except ValueError:
try:
n = int("".join([ch for ch in s if ch.isdigit()]),frm_bse)
return to_base(n, to_bse)
except ValueError:
return 0

Выход:

In [13]: chng_frm_base("123A123", 11, 10)
Out[13]: '2151042'

In [14]: chng_frm_base("123A123", 11, 8)
Out[14]: '10151202'

In [15]: chng_frm_base("123A123", 11, 2)
Out[15]: '1000001101001010000010'

In [16]: chng_frm_base("123A123", 11, 35)
Out[16]: '1f5xc'

In [17]: chng_frm_base("123A123", 11, 1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-9776e0abca26> in <module>()
----> 1 chng_frm_base("123A123", 11, 1)

<ipython-input-2-9c00d800545d> in chng_frm_base(s, frm_bse, to_bse)
10 def chng_frm_base(s, frm_bse, to_bse):
11     if to_bse < 2 or to_bse > 36 or frm_bse < 2 or frm_bse > 36:
---> 12         raise ValueError("bases must be between 2-36")
13     try:
14         return (to_base(int(s, frm_bse), to_bse))

ValueError: bases must be between 2-36

In [18]: chng_frm_base("hello world!", 10, 2)
Out[18]: 0

Который, если вы запускаете одни и те же примеры, используя php, выдает одинаковые значения для всех

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector