0

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

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

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

这是初始代码:

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

稍后在同一个脚本中:

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

href链接属性内的脚本:

<?php echo $ID; ?>

以下是会出现问题的示例 ID:

0xa87ea4fc142fcdeasjf90j3771eda500

4

1 回答 1

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

于 2019-07-03T16:51:56.907 回答