{"id":102859,"date":"2019-09-13T07:00:00","date_gmt":"2019-09-13T14:00:00","guid":{"rendered":"http:\/\/devblogs.microsoft.com\/oldnewthing\/?p=102859"},"modified":"2024-04-21T14:43:08","modified_gmt":"2024-04-21T21:43:08","slug":"20190913-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20190913-00\/?p=102859","title":{"rendered":"Another way to sort GUIDs: Java"},"content":{"rendered":"<p>Some time ago, I <a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20190426-00\/?p=102450\"> surveyed a number of GUID-sorting algorithms<\/a>. At the time, I noted, &#8220;Thankfully, it never occurred to anyone to try to sort GUID components as signed integers!&#8221;<\/p>\n<p>How wrong I was.<\/p>\n<p>For the purpose of sorting, Java treats each GUID as <a href=\"https:\/\/twitter.com\/GravityPike\/status\/1131707925301301248\"> a pair of <i>signed<\/i> 64-bit integers in big-endian format<\/a>.<\/p>\n<p>This means that the following list of GUIDs is sorted according to Java:<\/p>\n<table class=\"cp3\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">8<\/span>0000000-0000-0000-<span style=\"border: solid 1px currentcolor;\">8<\/span>000-000000000000}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">8<\/span>0FFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">F<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">0<\/span>0FFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>F00FFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF00FF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFF00-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-00FF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FF00-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-00FF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FF00-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">8<\/span>0FF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">F<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">0<\/span>0FF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>F00-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-00FFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FF00FFFFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFF00FFFFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFF00FFFF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFF00FF}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFF00}<\/tt><\/td>\n<\/tr>\n<tr>\n<td><tt>{<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}<\/tt><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The most significant bit of each 64-bit portion is a sign bit. This means that the smallest possible GUID is<\/p>\n<pre>  {<span style=\"border: solid 1px currentcolor;\">8<\/span>0000000-0000-0000-<span style=\"border: solid 1px currentcolor;\">8<\/span>000-000000000000}\r\n<\/pre>\n<p>and the largest possible GUID is<\/p>\n<pre>  {<span style=\"border: solid 1px currentcolor;\">7<\/span>FFFFFFF-FFFF-FFFF-<span style=\"border: solid 1px currentcolor;\">7<\/span>FFF-FFFFFFFFFFFF}\r\n<\/pre>\n<p>In the highlighted columns (corresponding to bits 0 and 64), the sort order is <tt>89ABCDEF01234567<\/tt>. In the other columns, the sort order is <tt>0123456789ABCDEF<\/tt>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Because it&#8217;s Java.<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[25],"class_list":["post-102859","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-code"],"acf":[],"blog_post_summary":"<p>Because it&#8217;s Java.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/102859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=102859"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/102859\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=102859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=102859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=102859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}