我有一个表单,可以在提交时将项目插入MySQL数据库。我决定使用PHP中的random_bytes
方法为项目创建16位ID,这样,每次提交表单时,我就已经知道ID,而不必为它重新查询数据库。 / p>
为了将ID插入页面的链接中,我尝试使用bin2hex
方法。这通常可以正常工作。但是,当ID尾随零时,该方法似乎将其切断(传递random_bytes
方法的直接结果)。在其他页面上,我在从数据库中检索到的同一ID上使用该函数时,它不能执行此操作,并且可以正常工作。
换句话说,如果ID以000结尾,则在数据库检索到的二进制表示形式上调用bin2hex
时,十六进制表示形式可以正确显示该ID。但是,在random_bytes
函数的直接输出上调用该函数时,十六进制表示形式中缺少零。
这是初始代码:
$uuid = random_bytes(16);
$uuidHex = bin2hex($uuid);
稍后使用同一脚本:
$GLOBALS["ID"] = '0x' . $uuidHex;
链接href
属性内的脚本:
<?php echo $ID; ?>
以下是可能会出现问题的示例ID:
0xa87ea4fc142fcdeasjf90j3771eda500
答案 0 :(得分:0)
我们怎么知道bin2hex
正在切掉尾随零?
$uuid = random_bytes(16);
这是不可读的,这将为您提供加密强度强的随机字节。我们将其转换为十六进制。
$uuidHex = bin2hex($uuid);
现在,这将为您提供 32位而不是16的随机字符串。但是为什么呢?因为以十六进制表示,字节始终表示为2个字符。用32除以2。此外,您还要在字符串中添加“'0x'”,以使其变为18位。要获得16位的结果,请执行
$uuid = random_bytes(7);
$uuidHex = bin2hex($uuid);
$GLOBALS["ID"] = '0x' . $uuidHex; // 16 bit string
由于random_bytes(7)
的字符串长度是2的7乘以14,因此我们附加了“ 0x”,即14 + 2
=
是16
位的字符串