我有一个表单,在提交时将项插入到MySQL数据库中。我已经决定使用PHP中的random_bytes方法为项创建16位ID,这样每次表单提交时,我都已经知道ID,并且不必重新查询数据库中的ID。
为了将ID插入到页面中的链接中,我尝试使用bin2hex方法。这通常是正确的。但是,当ID有尾随零时,该方法似乎切断了它们(传入random_bytes方法的直接结果)。在其他页面中,在从数据库中检索到的相同ID上使用函数时,它不会这样做,而且工作正常。
换句话说,如果ID以1000结尾,则在数据库检索到的二进制表示上调用bin2hex时,十六进制表示形式将正确显示。但是,当对random_bytes函数的直接输出调用该函数时,十六进制表示中缺少零。
以下是初始代码:
$uuid = random_bytes(16);
$uuidHex = bin2hex($uuid);稍后在同一脚本中:
$GLOBALS["ID"] = '0x' . $uuidHex;链接href属性内的脚本:
<?php echo $ID; ?>下面是一个出现问题的示例ID:
0xa87ea4fc142fcdeasjf90j3771eda500
发布于 2019-07-03 16:51:56
我们怎么知道bin2hex在切割尾随零点呢?
$uuid = random_bytes(16);这是不可读的,这将给您密码强的随机字节。我们把它转换成十六进制。
$uuidHex = bin2hex($uuid); 现在,这将给出32位的随机字符串,而不是16位。但是为什么呢?因为,在十六进制中,字节总是表示为两个字符。除以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位字符串。
https://stackoverflow.com/questions/56874513
复制相似问题