Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中从表的两个主键生成唯一的12个字母数字字符串_Php_Algorithm - Fatal编程技术网

在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位无符号整数。2
int
组合将有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来完成它。