bin2hex() 切断尾随零

bin2hex() Cuts off Trailing Zeros

我有一个表单,可以在提交后将项目插入 MySQL 数据库。我决定使用 PHP 中的 random_bytes 方法为项目创建 16 位 ID,这样每次提交表单时我就已经知道 ID,而不必为它重新查询数据库为此。

为了将 ID 插入页面中的 link,我尝试使用 bin2hex 方法。这通常可以正常工作。然而,当 ID 有尾随零时,该方法似乎将它们切断(传递 random_bytes 方法的直接结果)。在我使用从数据库检索到的相同 ID 上的函数的其他页面中,它不会执行此操作并且可以正常工作。

换句话说,如果 ID 以 000 结尾,则在对数据库检索的二进制表示形式调用 bin2hex 时,它会以十六进制表示形式正确显示。但是,当在 random_bytes 函数的直接输出上调用该函数时,十六进制表示中缺少零。

这是初始代码:

$uuid = random_bytes(16);
$uuidHex = bin2hex($uuid);

稍后在同一脚本中:

$GLOBALS["ID"]  = '0x' . $uuidHex;

脚本里面linkhref属性:

<?php echo $ID; ?>

这是一个可能会出现问题的 ID 示例:

0xa87ea4fc142fcdeasjf90j3771eda500

我们怎么知道 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) 我们得到字符串长度的 7 乘以 2,即 14 然后我们附加“0x”,这使得 14 + 2 = a 16位串