bin2hex()消除尾随零

时间:2019-07-03 16:27:59

标签: php bin2hex

我有一个表单,可以在提交时将项目插入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

1 个答案:

答案 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位的字符串