Generating GUIDs

  • Revision slug: Generating_GUIDs
  • Revision title: Generating GUIDs
  • Revision id: 85434
  • Created:
  • Creator: Sevenspade
  • Is current revision? No
  • Comment Suggest that support for GUIDs for use as add-on IDs is only for legacy add-ons.; 14 words added, 6 words removed

Revision Content

GUIDs are used in Mozilla programming for identifying several types of entities, including XPCOM Interfaces (this type of GUIDs is callled IID), components (CID), and legacy add-ons—like extensions and themes—that were created prior to Firefox 1.5. Add-ons can (and should) be identified with IDs of the form extensionname@organization.tld since Firefox 1.5.

{{ warning("If you just want an ID for your add-on, generating a GUID is almost definitely not what you want to do. Using the extensionname@organization.tld form is approximately one thousand times easier for everyone involved. Don't have a domain name? Do you have a blog on a subdomain? Use that. If all else fails, using extensionname@addons.mozilla.org should be fine; no one will care. Remember, these are identifiers, not e-mail addresses, and they're never resolved.") }}

Canonical form

The common form of a GUID is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx, where each x stands for a hexadecimal digit. There are a number of tools that can be used to generate a GUID in the canonical form.

Online tools

Windows

Windows users can use the GuidGen tool from Microsoft to obtain a GUID. (This tool is also part of MS Visual C++)

Linux

Use /usr/bin/uuidgen. This can be found in package libuuid1 (Debian).

Mac OS X

Use /usr/bin/uuidgen.

Perl

jkeiser's Mozilla tools include a UUID generator with output format of both C++ and IDL style.

nsIUUIDGenerator

A UUID can be generated from privileged Mozilla code using nsIUUIDGenerator. See the linked page for details.

COM/XPCOM format

When #define-ing IIDs and CIDs in Mozilla C++ code, you generally use the following format:

// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
#define NS_...ID \
{ 0xXXXXXXXX, 0xXXXX, 0xXXXX, \
  { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX } }

You can generate code in this format using one of the following tools.

Online tools

guidgen

guidgen.exe, part of Microsoft Visual Studio, can generate UUIDs in this format.

bash

You can put the following into your .bashrc file:

uuidgen-c++()
{
       local UUID=$(uuidgen)
       echo "// $UUID"
       echo "#define NS__IID \\"
       echo "{ 0x${UUID:0:8}, 0x${UUID:9:4}, 0x${UUID:14:4}, \\"
       echo -n "  { 0x${UUID:19:2}, 0x${UUID:21:2}, 0x${UUID:24:2}, "
       echo -n "0x${UUID:26:2}, 0x${UUID:28:2}, 0x${UUID:30:2}, "
       echo "0x${UUID:32:2}, 0x${UUID:34:2} } }"
}

Perl

#!/usr/bin/perl
$uuid = `uuidgen`;
chomp $uuid;
print $uuid, "\n";
@parts = ($uuid =~ /^(.{8})-(.{4})-(.{4})-(..)(..)-(..)(..)(..)(..)(..)(..)$/);
print "{ 0x$parts[0], 0x$parts[1], 0x$parts[2], \\", "\n", " { ";
for (3 .. 9) {
    print "0x$parts[$_], ";
}
print "0x$parts[10] } }", "\n";
{{ languages( { "fr": "fr/G\u00e9n\u00e9ration_de_GUID", "ja": "ja/Generating_GUIDs", "pl": "pl/Generowanie_GUID" } ) }}

Revision Source

<p><strong>GUID</strong>s are used in Mozilla programming for identifying several types of entities, including XPCOM <a href="/en/Interfaces" title="en/Interfaces">Interfaces</a> (this type of GUIDs is callled IID), components (CID), and legacy add-ons—like <a href="/en/Extensions" title="en/Extensions">extensions</a> and <a href="/en/Themes" title="en/Themes">themes</a>—that were created prior to Firefox 1.5. <a href="/en/Install_Manifests#id" title="en/Install_Manifests#id">Add-ons can (and should) be identified with IDs of the form <code><var>extensionname</var>@<var>organization</var>.<var>tld</var></code></a> since <a href="/en/Firefox_1.5_for_developers" title="en/Firefox_1.5_for_developers">Firefox 1.5</a>.</p>
<p>{{ warning("If you just want an ID for your add-on, generating a GUID is almost definitely not what you want to do. Using the <code><var>extensionname</var>@<var>organization</var>.<var>tld</var></code> form is approximately one thousand times easier for everyone involved. Don't have a domain name? Do you have a blog on a subdomain? Use that. If all else fails, using <code><var>extensionname</var>@addons.mozilla.org</code> should be fine; no one will care. Remember, these are identifiers, not e-mail addresses, and they're never resolved.") }}</p>
<h3 name="Canonical_form">Canonical form</h3>
<p>The common form of a GUID is <code>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx</code>, where each <code>x</code> stands for a hexadecimal digit. There are a number of tools that can be used to generate a GUID in the canonical form.</p>
<h4 name="Online_tools">Online tools</h4>
<ul> <li><a class="external" href="http://www.somacon.com/p113.php">Generate GUID Online</a></li> <li><a class="external" href="http://www.famkruithof.net/uuid/uuidgen">UUID (GUID) Generator on the WEB</a></li> <li><a class="external" href="http://mozilla.pettay.fi/cgi-bin/mozuuid.pl">UUID Generator for Mozilla Code</a> (both IDL and C++.h forms)</li> <li>You can get a GUID from one of the bots (such as botbot, firebot) on <a class="link-irc" href="irc://irc.mozilla.org/firefox">#firefox</a> IRC channel by <code>/msg</code>ing "uuid" to them.</li>
</ul>
<h4 name="Windows">Windows</h4>
<p>Windows users can use the <a class="external" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=94551F58-484F-4A8C-BB39-ADB270833AFC&amp;displaylang=en">GuidGen</a> tool from Microsoft to obtain a GUID. (This tool is also part of MS Visual C++)</p>
<h4 name="Linux">Linux</h4>
<p>Use <code>/usr/bin/uuidgen</code>. This can be found in package <code>libuuid1</code> (Debian).</p>
<h4>Mac OS X</h4>
<p>Use <code>/usr/bin/uuidgen</code>.</p>
<h4 name="Perl">Perl</h4>
<p><a class="external" href="http://www.johnkeiser.com/mozilla/mozilla_tools.html">jkeiser's Mozilla tools</a> include a UUID generator with output format of both C++ and IDL style.</p>
<h4 name="nsIUUIDGenerator">nsIUUIDGenerator</h4>
<p>A UUID can be generated from privileged Mozilla code using <code><a href="/en/XPCOM_Interface_Reference/nsIUUIDGenerator" title="en/nsIUUIDGenerator">nsIUUIDGenerator</a></code>. See the linked page for details.</p>
<h3 name="COM.2FXPCOM_format">COM/XPCOM format</h3>
<p>When <code>#define</code>-ing IIDs and CIDs in Mozilla C++ code, you generally use the following format:</p>
<pre class="eval">// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
#define NS_...ID \
{ 0xXXXXXXXX, 0xXXXX, 0xXXXX, \
  { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX } }
</pre>
<p>You can generate code in this format using one of the following tools.</p>
<h4 name="Online_tools_2">Online tools</h4>
<ul> <li><a class=" external" href="http://mozilla.pettay.fi/cgi-bin/mozuuid.pl" rel="freelink">http://mozilla.pettay.fi/cgi-bin/mozuuid.pl</a></li>
</ul>
<h4 name="guidgen">guidgen</h4>
<p><code>guidgen.exe</code>, part of Microsoft Visual Studio, can generate UUIDs in this format.</p>
<h4 name="bash">bash</h4>
<p>You can put the following into your <code>.bashrc</code> file:</p>
<pre>uuidgen-c++()
{
       local UUID=$(uuidgen)
       echo "// $UUID"
       echo "#define NS__IID \\"
       echo "{ 0x${UUID:0:8}, 0x${UUID:9:4}, 0x${UUID:14:4}, \\"
       echo -n "  { 0x${UUID:19:2}, 0x${UUID:21:2}, 0x${UUID:24:2}, "
       echo -n "0x${UUID:26:2}, 0x${UUID:28:2}, 0x${UUID:30:2}, "
       echo "0x${UUID:32:2}, 0x${UUID:34:2} } }"
}
</pre>
<h4 name="Perl_2">Perl</h4>
<pre>#!/usr/bin/perl
$uuid = `uuidgen`;
chomp $uuid;
print $uuid, "\n";
@parts = ($uuid =~ /^(.{8})-(.{4})-(.{4})-(..)(..)-(..)(..)(..)(..)(..)(..)$/);
print "{ 0x$parts[0], 0x$parts[1], 0x$parts[2], \\", "\n", " { ";
for (3 .. 9) {
    print "0x$parts[$_], ";
}
print "0x$parts[10] } }", "\n";
</pre>
<dl> <dd>{{ languages( { "fr": "fr/G\u00e9n\u00e9ration_de_GUID", "ja": "ja/Generating_GUIDs", "pl": "pl/Generowanie_GUID" } ) }}</dd>
</dl>
Revert to this revision