note 81219 added to function.mssql-guid-string
| From: | CorvusCorax at osu1 dot php dot net | Date: | Tue, 19 Feb 2008 03:58:02 +0000 |
| Subject: | note 81219 added to function.mssql-guid-string | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-136263@lists.php.net to get a copy of this message | ||
How can a binary GUID be identified as a binary GUID?
- mssql_field_type() returns 'blob' for GUID fields...
- mssql_guid_string() returns strings for all sort of arbitrary input data, regardless of length and
content (though not all are necessarily valid GUID string represenations, since length varies)
- is_string() on GUID variables is true
therefore a mssql_is_guid() function would be a nice thing.
Unfortunately, there is very little that makes a GUID a GUID. Aside from the length of 16 bytes
there are only 2 indicators (and even those only for microsoft system call compatibly generated
GUIDs):
the upper 4 bits of character 7 encode the version of the GUID, and are either 0001 (v1) , 0011 v3),
or 0100 (v4)
(ASCII characters 10 - 1f, 30 ('0') to 3f ('?') or 40 ('@') to 4f
('O'))
depending on the encoding version of the GUID.
GUIDs generated by mssql server 2005s "NEWID()" statement are version 4, indicating that
the GUID is completely randomly generated
the upper 1 to 3 bits of character 8 which encode the GUID variant. In the case of GUIDs generated
by MsSQL server 2005 the variant always seems to be 'Standard' which is indicated by bit
sequence 10.
((non)ASCII characters 81 to BF)
so as long as no custom hacked or 3rd party inserted GUIDs are used this should be working:
<?php
/**
* determine wether binary data represents a valid GUID
*/
function mssql_is_guid($guid)
{
if (!is_string($guid)) return false;
if (strlen($guid)!=16) return false;
$version=ord(substr($guid,7,1))>>4;
// version 1 : Time-based version Uses timestamp, clock sequence, and MAC network card address
// version 2 : Reserverd
// version 3 : Name-based version Constructs values from a name for all sections
// version 4 : Random version Use random numbers for all sections
if ($version<1 || $version>4) return false;
$typefield=ord(substr($guid,8,1))>>4;
$type=-1;
if (($typefield & bindec(1000))==bindec(0000)) $type=0; // type 0 indicated by 0??? Reserved
for NCS (Network Computing System) backward compatibility
if (($typefield & bindec(1100))==bindec(1000)) $type=2; // type 2 indicated by 10?? Standard
format
if (($typefield & bindec(1110))==bindec(1100)) $type=6; // type 6 indicated by 110? Reserved
for Microsoft Corporation backward compatibility
if (($typefield & bindec(1110))==bindec(1110)) $type=7; // type 7 indicated by 111? Reserved
for future definition
// assuming Standard type for SQL GUIDs
if ($type!=2) return false;
return true;
}
$valid_guid='xxxxxxx'.'A'.chr(0xA2).'xxxxxxx';
if (mssql_is_guid($valid_guid)) $valid_guid=mssql_guid_string($valid_guid);
echo ($valid_guid);
?>
source:
http://msdn2.microsoft.com/en-us/library/aa446557.aspx
http://en.wikipedia.org/wiki/GUID
----
Server IP: 203.202.10.60
Probable Submitter: 150.101.121.21
----
Manual Page -- http://www.php.net/manual/en/function.mssql-guid-string.php
Edit -- https://master.php.net/note/edit/81219
Del: integrated -- https://master.php.net/note/delete/81219/integrated
Del: useless -- https://master.php.net/note/delete/81219/useless
Del: bad code -- https://master.php.net/note/delete/81219/bad+code
Del: spam -- https://master.php.net/note/delete/81219/spam
Del: non-english -- https://master.php.net/note/delete/81219/non-english
Del: in docs -- https://master.php.net/note/delete/81219/in+docs
Del: other reasons-- https://master.php.net/note/delete/81219
Reject -- https://master.php.net/note/reject/81219
Search -- https://master.php.net/manage/user-notes.php