Базовое преобразование в python с заданной строкой

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

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

Вывод

 2151042 

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

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

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

Ранее предложенный метод не будет работать для двоичных и многих других преобразований, это будет происходить с любой базы от 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-выходы, одинаковые значения для всех.