Guid to Binary 16来回PHP

时间:2012-04-25 00:35:28

标签: php guid

我将一个guid(实际上指向一个文件名)存储为mysql中的二进制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))
)

其中hash是二进制16字段。任何线索?

感谢。

1 个答案:

答案 0 :(得分:1)

在你的CONCAT中,你似乎将某些部分视为大端,而其他部分则视为小端。我相信HEX()会返回big-endian,所以你应该在你的包中使用“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(),' - ',''))将字符串存储在数据库中而不是打包时,以便您知道在两个方向上都使用了相同的转换。