指导二进制 16 来回 PHP



我在mysql中将一个guid(实际上指向文件名)存储为二进制16。我正在使用此函数生成 guid

private function guid(){
    if (function_exists('com_create_guid') === true) {
        return trim(com_create_guid(), '{}');
    }
    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), 
        mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), 
        mt_rand(0, 65535), mt_rand(0, 65535));
}

我正在使用函数将 guid 保存为二进制文件

$binary =  pack("h*", str_replace('-', '', $guid ));

现在的问题是,当将二进制字段从数据库转换回 guid 以链接文件时,我没有得到上面 guid 函数生成的原始 guid,我使用此 mysql 语句将二进制 16 转换回 guid:

CONCAT(
    HEX(SUBSTRING(hash,4,1)), HEX(SUBSTRING(hash,3,1)),
    HEX(SUBSTRING(hash,2,1)), HEX(SUBSTRING(hash,1,1)) , '-', 
    HEX(SUBSTRING(hash,6,1)),HEX(SUBSTRING(hash,5,1)),'-',
    HEX(SUBSTRING(hash,8,1)) , HEX(SUBSTRING(hash,7,1)),'-',
    HEX(SUBSTRING(hash,9,2)),'-',HEX(SUBSTRING(hash,11,6))
)

其中哈希是二进制 16 字段。有什么线索吗?

谢谢。

在您的 CONCAT 中,您似乎将某些部分视为大端序,而其他部分则视为小端序。我相信 HEX() 会返回大端序,所以你应该在你的包中使用"H*",而不是"h*"。然后你应该能够按顺序处理字节:HEX(SUBSTRING(hash,1,4

)), '-', HEX(SUBSTRING(hash,5,2)), '-', HEX(SUBSTRING(hash,7,2)), '-', HEX(SUBSTRING(hash,9,2)), '-', HEX(SUBSTRING(hash,11,6))

另外,你可能想知道MySQL有一个UUID()函数。在数据库中存储字符串时,使用例如 UNHEX(REPLACE(UUID()、'-', '')) 可能更容易,而不是打包,这样你就知道在两个方向上使用相同的转换。

相关内容

  • 没有找到相关文章

最新更新