在php中从表的两个主键生成唯一的12个字母数字字符串
我有两个表:在php中从表的两个主键生成唯一的12个字母数字字符串,php,algorithm,Php,Algorithm,我有两个表:category(cat\u id type int,cat\u name)和books(book\u id type int,cat\u id)。当我将一本书分配给一个用户时,他将得到一个书代码。我想形成包含12个字母数字字符的图书代码,它必须来自cat\u id和book\u id。此外,我应该能够解码代码以获得cat\u id和book\u id。有什么想法吗?使用十六进制有一种更简单的方法,但您需要决定书籍使用多少位数,类别使用多少位数 例如,我建议使用8表示书籍,使用4表示
category(cat\u id type int,cat\u name)
和books(book\u id type int,cat\u id)
。当我将一本书分配给一个用户时,他将得到一个书代码
。我想形成包含12个字母数字字符的图书代码,它必须来自cat\u id
和book\u id
。此外,我应该能够解码代码以获得cat\u id
和book\u id
。有什么想法吗?使用十六进制有一种更简单的方法,但您需要决定书籍使用多少位数,类别使用多少位数
例如,我建议使用8表示书籍,使用4表示类别,就像。
通过使用十六进制1,最大记录为FFFFFFFFFF,您可以使用书籍(最大4294967295本书籍)和65535个类别的所有未签名int
实际上,LPAD(十六进制(book_id),8,'0')
用于前8位,而LPAD(十六进制(cat_id),4,'0')
用于后4位
因此,您需要的图书代码可以通过从图书中选择CONCAT(LPAD(十六进制(图书id),8,'0')、LPAD(十六进制(图书id),4,'0'))来完成
要检索回:
选择UNHEX(substr(code,1,8))作为book_id,从book code中选择UNHEX(substr(code,9,4))作为cat_id,其中id=1
如果您想在图书编码中使用更大的数据集,可以尝试对这两个项目使用base36甚至base62(区分大小写)编码。这种编码需要您自己的用户过程代码。假设
int
类型是32位无符号整数。2int
组合将有2^64个唯一值,约为1.844e19
如果我们只使用小写或大写英文字母,加上数字,则有36^12=4.738e18个不同的值,这不足以创建从2个键到书本代码的一对一映射
如果在书本代码的字符集中再添加5个字符,则将有41^12=2.256e19个不同的值,这刚好足以创建一对一映射
但是,转换将涉及除法和乘法,当您从书本代码转换回键时,可能会发生整数溢出
如果可能,您可能希望将字符集扩展到64个字符:26*2英文字母小写/大写、10位数字和2个特殊字符(可能是\uuu
或-
),在这些字符中,您可以使用位移位,这样可以避免整数溢出。对于未使用的位,您可能希望用随机数据填充它,该数据由2个键作为种子;反向构造将忽略随机位的(固定)位置。好的,开始
这可以处理最大有符号整数类型。并生成不超过12个字符
$firstId = "2147483646";
$secondId = "2147483646";
$firstBinary = str_pad(base_convert($firstId, 10, 2), 31, "0", STR_PAD_LEFT);
$secondBinary = str_pad(base_convert($secondId, 10, 2), 31, "0", STR_PAD_LEFT);
$finalBase36 = str_pad(base_convert($firstBinary.$secondBinary, 2, 36), 12, "0", STR_PAD_LEFT);
var_dump($finalBase36);
更新:对不起,我弄错了。。这将通过更新代码完成trik。cat_id和book_id的数据类型是什么?@NHAHDH都是int类型。cat_id和book的长度是多少_id@AbbyChauYuHoi两者都是主键,从1开始自动递增。我的意思是要显示的最大长度。您是否要用完所有的2147483647,甚至是未签名的2147483647?有关更多信息,请参阅:php base 36 conversion:var_dump(base_conversion($firstId.$secondId,10,36))@我没有注意到有一个php标记^^“PHP的无用功能比任何人想象的都多:DI意味着我不允许使用PHP来完成它。