python 转换 php,php-给定字符串的python中的基本转换

本文介绍如何在Python中模仿PHP的base_convert函数,将包含字母的字符串转换为指定基数的整数,适用于生成唯一ID。示例展示了不同基数下的转换结果,但需要注意Python处理非数字字符的方式与PHP有所不同。
摘要由CSDN通过智能技术生成

在PHP中,给定一个字符串值(用字符分隔的整数),我们可以计算其整数表示形式:

$hashable = "123A123"; // notice "A" delim

$hash_int = base_convert($hashable, 11, 10);

echo $hash_int;

输出量

2151042

这很有用,因为结果对于大范围的字符串(当然是短字符串)是唯一的.我将其用于应用程序中的ID生成.

我们如何在python中进行相同的转换?是否可以在PHP和python中为相同的字符串生成相等的整数?

也许首先我们需要将可哈希字符串的hash int值转换为整数的基数,但是我们到底是怎么做到的呢?

解决方法:

以前建议的方法对于二进制和许多其他转换将失败,它将从2到36的任何基数,对于php implementation的无效字符串将返回0,php实现不会忽略输出中的字母,除非您为base,然后它尝试仅查找数字并进行转换,因此您也无法尽可能地返回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)

in ()

----> 1 chng_frm_base("123A123", 11, 1)

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运行相同的示例,则会为所有输出相同的值.

标签:base,python-3-x,python,php

来源: https://codeday.me/bug/20191119/2036001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值