2012-04-25 33 views
2

我存儲一個guid(實際上指向一個文件名)作爲二進制16在MySQL中。我使用這個函數生成的GUID指導二進制16來回PHP

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)); 
} 

我節省使用功能

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

的問題是現在從數據庫轉換二進制領域時,回到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 FIEL d。任何線索?

謝謝。

回答

1

在您的CONCAT中,您似乎將某些部分視爲big-endian,其他人則視爲小端。我相信HEX()會返回big-endian,所以你應該在包中使用「H *」,而不是「h *」。那麼你應該可以按照以下順序處理字節:HEX(SUBSTRING(hash,1,4)),' - ',HEX(SUBSTRING(hash,5,2)),' - ',HEX(SUBSTRING(hash,此外,你可能想知道MySQL有(),' - ',HEX(SUBSTRING(hash,9,2)),' - ',HEX(SUBSTRING(hash,11,6))

一個UUID()函數。您可能更容易使用例如UNHEX(REPLACE(UUID(),' - ',''))將字符串存儲在數據庫中,而不是打包,以便知道在兩個方向上都使用了相同的轉換。