我正在尝试构建一个可以通过扫描qrcode来识别用户的应用。为此,我想使用主键作为标识符。由于整数的字符长度很短,因此它不会像qrcode一样好看。
所以我的问题是:是否可以将int转换为长度超过10-12个字符的字符串(如果可能的话,固定长度),字符和数字的混合可以反转为原始整数。
答案 0 :(得分:1)
您可以做的是制作用户ID的SHA256并将其转换为QR码。 然后,当用户读取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的速度,然后查询速度会快得多。
另一种选择是在数字前添加一些字母。它将为您提供随机字符串,精美的QR,您可以使用简单的正则表达式提取数字ID。
使用PHP random string generator中的函数(不要忘记从$字符中删除数字)代码可以是:
//encoding
$size = 12;
$str = generateRandomString($size-strlen($userId)).$userId;
//decoding
preg_match('/(\d+)$/', $str, $matching);
$userId = $matching[1];
答案 1 :(得分:0)
答案 2 :(得分:0)
PHP中的数字具有"最大大小"稍微偏离(不是错误,只是关闭= P)
来自manual:
如果PHP遇到超出整数类型边界的数字,它将被解释为浮点数。
因此,如果需要,您可以使用非常大的数字作为您的QR码。不应该是一个问题。然而,更好的是要考虑"你究竟需要什么"?
如果你需要一个数字值,但希望它是十六进制的,你可以使用base_convert()
在数字之间来回移动:
$val = 1234;
$hex = base_convert($val, 10, 16);
但是,如果字符串更适合您,您可以使用base64_encode()
对其进行编码:
$val = 'awesome string value';
$encoded = base64_encode($val);
<强>更新强>
根据评论,如果字符串太短,听起来你也想填充字符串。您可以使用str_pad()
来完成此任务:
$val = str_pad("1", 10, "0", STR_PAD_LEFT);
echo $val;
// displays: 0000000001
$orig = intval($val);
echo $orig;
// displays: 1
str_pad()
的