PHP int 到更长的字符串以用于 qrcode
PHP int to longer string for use with qrcode
我正在尝试构建一个可以通过扫描二维码来识别用户的应用程序。为此,我想使用主键作为标识符。由于整型字符长度较短,作为二维码不好看
所以我的问题是:是否可以将 int 转换为长度超过 10-12 个字符的字符串(如果可能,固定长度),字符和数字的混合可以反转为原始整数。
您可以使用 base_convert 函数将整数转换为任何基数。
这是文档。
您可以做的是对您的用户 ID 进行 SHA256 编码并将其转换为二维码。
然后当用户读取 QR 码并向您发送 sha 值时,您尝试将其与数据库中用户 ID 的 SHA 相匹配。
所以这是从用户 ID 获取 SHA 哈希的方法:
$hash = hash('sha256', $userId); // The result is long enough string for QA
当您需要根据 SHA 查找用户时,请执行以下操作:
select * from users where SHA2(id, 256) = 'SHA_PROVIDED_BY_USER';
为了加快查找过程,您可以将 SHA 也存储在数据库中,这样查询会快得多。
另一种选择是在数字前加上一些字母。它会给你随机字符串,漂亮的二维码,你可以用简单的正则表达式提取数字 ID。
使用 PHP random string generator 中的函数(不要忘记从 $characters 中删除数字)代码可以是:
//encoding
$size = 12;
$str = generateRandomString($size-strlen($userId)).$userId;
//decoding
preg_match('/(\d+)$/', $str, $matching);
$userId = $matching[1];
关于 PHP 中的数字有 "maximum size" 的说法有点不对(不是 错误 ,只是不对 =P)
来自manual:
If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead.
因此,如果需要,您可以使用 非常大的数字 作为 QR 码。应该不是问题。不过,想想"what exactly do you need"?
会更好
如果你需要一个数值,但想要它的十六进制,你可以使用base_convert()
在数字之间来回移动:
$val = 1234;
$hex = base_convert($val, 10, 16);
但是,如果字符串更适合您,您可以使用 base64_encode()
对其进行编码:
$val = 'awesome string value';
$encoded = base64_encode($val);
更新
根据评论,听起来您还想 pad 如果字符串太短。您可以使用 str_pad()
来完成此操作:
$val = str_pad("1", 10, "0", STR_PAD_LEFT);
echo $val;
// displays: 0000000001
$orig = intval($val);
echo $orig;
// displays: 1
Coderpad Example 个 str_pad()
我正在尝试构建一个可以通过扫描二维码来识别用户的应用程序。为此,我想使用主键作为标识符。由于整型字符长度较短,作为二维码不好看
所以我的问题是:是否可以将 int 转换为长度超过 10-12 个字符的字符串(如果可能,固定长度),字符和数字的混合可以反转为原始整数。
您可以使用 base_convert 函数将整数转换为任何基数。
这是文档。
您可以做的是对您的用户 ID 进行 SHA256 编码并将其转换为二维码。 然后当用户读取 QR 码并向您发送 sha 值时,您尝试将其与数据库中用户 ID 的 SHA 相匹配。
所以这是从用户 ID 获取 SHA 哈希的方法:
$hash = hash('sha256', $userId); // The result is long enough string for QA
当您需要根据 SHA 查找用户时,请执行以下操作:
select * from users where SHA2(id, 256) = 'SHA_PROVIDED_BY_USER';
为了加快查找过程,您可以将 SHA 也存储在数据库中,这样查询会快得多。
另一种选择是在数字前加上一些字母。它会给你随机字符串,漂亮的二维码,你可以用简单的正则表达式提取数字 ID。
使用 PHP random string generator 中的函数(不要忘记从 $characters 中删除数字)代码可以是:
//encoding
$size = 12;
$str = generateRandomString($size-strlen($userId)).$userId;
//decoding
preg_match('/(\d+)$/', $str, $matching);
$userId = $matching[1];
关于 PHP 中的数字有 "maximum size" 的说法有点不对(不是 错误 ,只是不对 =P)
来自manual:
If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead.
因此,如果需要,您可以使用 非常大的数字 作为 QR 码。应该不是问题。不过,想想"what exactly do you need"?
会更好如果你需要一个数值,但想要它的十六进制,你可以使用base_convert()
在数字之间来回移动:
$val = 1234;
$hex = base_convert($val, 10, 16);
但是,如果字符串更适合您,您可以使用 base64_encode()
对其进行编码:
$val = 'awesome string value';
$encoded = base64_encode($val);
更新
根据评论,听起来您还想 pad 如果字符串太短。您可以使用 str_pad()
来完成此操作:
$val = str_pad("1", 10, "0", STR_PAD_LEFT);
echo $val;
// displays: 0000000001
$orig = intval($val);
echo $orig;
// displays: 1
Coderpad Example 个 str_pad()