Good point. So, to guarantee a UUID that is unique to the URI and the transaction we then change the function to use the request key in the hash like this:
let $hash := xdmp:md5( concat( $uri, xs:string(current-dateTime()), $namespace, xs:string(xdmp:request()) ) ) If we need a unique UUID for every call of the function we then need to keep a count that increments with each call of the function and tracks the clock ticks between calls. Keith L. Breinholt breinhol...@ldschurch.org<mailto:breinhol...@ldschurch.org> From: general-boun...@developer.marklogic.com [mailto:general-boun...@developer.marklogic.com] On Behalf Of Walter Underwood Sent: Monday, March 29, 2010 10:55 AM To: General Mark Logic Developer Discussion Subject: Re: [MarkLogic Dev General] Unique key construction Using timestamps plus a random number is a dangerous way to build UUIDs. The birthday paradox makes it pretty easy to generate dupes inbetween clock ticks. I know, because my UUID generator did that about 15 years ago. The usual solution requires that you know the resolution of your clock. Fill the low-order bits of the timestamp with a sequence number that increments for each UUID generated. When that sequence field hits the limit, you busy-wait on the clock until it ticks. That's what the DCE code did, and my non-unique UUIDs went away after I did it too. wunder == Walter Underwood walter.underw...@marklogic.com<mailto:walter.underw...@marklogic.com> On Mar 29, 2010, at 9:35 AM, Darin McBeath wrote: Yes, that would likely be more efficient ... forgot that his function had been added :-) ________________________________ From: Michael Blakeley <michael.blake...@marklogic.com<mailto:michael.blake...@marklogic.com>> To: General Mark Logic Developer Discussion <general@developer.marklogic.com<mailto:general@developer.marklogic.com>> Cc: "McBeath, Darin W (ELS-STL)" <d.mcbe...@elsevier.com<mailto:d.mcbe...@elsevier.com>> Sent: Mon, March 29, 2010 12:18:26 PM Subject: Re: [MarkLogic Dev General] Unique key construction Wouldn't it be more efficient to add xdmp:elapsed-time()? -- Mike On 2010-03-29 08:19, McBeath, Darin W (ELS-STL) wrote: > I believe this could be fixed (if necessary) by wrapping the > current-dateTime() call with a xdmp:eval. > > xdmp:eval("current-dateTime()") > > Darin. > > -----Original Message----- > From: > general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com> > on behalf of Geert Josten > Sent: Mon 3/29/2010 10:00 AM > To: General Mark Logic Developer Discussion > Subject: RE: [MarkLogic Dev General] Unique key construction > > Note: this code will return only one unique value per transaction. > current-datetime() returns the same value throughout the transaction as > MarkLogic Server is based on point-in-time querying.. > > Kind regards, > Geert > > ________________________________ > From: > general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com> > > [mailto:general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com>] > On Behalf Of Keith L. Breinholt > Sent: maandag 29 maart 2010 16:45 > To: General Mark Logic Developer Discussion > Subject: RE: [MarkLogic Dev General] Unique key construction > > > Here is a UUID version 3 implementation that we use for URLs that is unique > to the name, host and time created: > > > > declare variable $g_defaultNamespace as xs:string := > xdmp:host-name(xdmp:host()); > declare variable $g_uuidVersion as xs:unsignedLong := 3; > declare variable $g_uuidReserved as xs:unsignedLong := 8; > > (: > Calculate the UUID and set the UUID property on the file. > > The layout of a UUID is as follows. > 0 1 2 3 > 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > | time_low | > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > | time_mid | time_hi |version| > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > |clk_seq_hi |res| clk_seq_low | node (0-1) | > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > | node (2-5) | > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f > > This implements version 3 of the UUID specification. > The timestamp is a 60-bit value. > The clock sequence is a 14 bit value. > The node is a 48-bit name value. > :) > declare function meta:uuid( $uri as xs:string ) > as xs:string > { > meta:uuid( $uri, $g_defaultNamespace ) > }; > > declare function meta:uuid( $uri as xs:string, $namespace as xs:string ) > as xs:string > { > (: calculate md5 with a dateTime for our random values :) > let $hash := xdmp:md5( concat( $uri, xs:string(current-dateTime()), > $namespace ) ) > return > concat ( > substring( $hash, 1, 15 ), > (: set version bits :) > xdmp:integer-to-hex($g_uuidVersion), > (: set reserved bits :) > substring( $hash, 17, 1 ), > xdmp:integer-to-hex((xdmp:hex-to-integer(substring($hash, 18, 1)) idiv > 4) + $g_uuidReserved), > substring( $hash, 19, 14 ) > ) > }; > > > > > Keith L. Breinholt > > breinhol...@ldschurch.org<mailto:breinhol...@ldschurch.org> > > > > > > -----Original Message----- > From: > general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com> > > [mailto:general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com>] > On Behalf Of Geert Josten > Sent: Monday, March 29, 2010 2:35 AM > To: General Mark Logic Developer Discussion > Subject: RE: [MarkLogic Dev General] Unique key construction > > > > Hi Deepak, > > > > Look in the Modules, not the Admin folder. Here is a typical case taken from > triggers.xqy: > > > > define function > > get-unique-trigger-id() > > as xs:unsignedLong > > { > > let $col := triggers-collection(), > > $attempt := xdmp:random(), > > $doc-uri := fn:concat(triggers-uri(), xs:string($attempt)), > > $docs := for $d in fn:collection($col) return fn:base-uri($d) > > return > > if ($doc-uri = $docs) > > then get-unique-trigger-id() > > else $attempt > > } > > > > You can make it slightly more robust by counting the attempts and throwing an > error if you need to many attempts. The number of unique numbers generated by > xdmp:random is large though, so that is only necessary when you have good > reason to believe that you could approach that limit.. > > > > Kind regards, > > Geert > > > >> > > > > > > drs. G.P.H. (Geert) Josten > > Consultant > > > > > > Daidalos BV > > Hoekeindsehof 1-4 > > 2665 JZ Bleiswijk > > > > T +31 (0)10 850 1200 > > F +31 (0)10 850 1199 > > > > mailto:geert.jos...@daidalos.nl<mailto:geert.jos...@daidalos.nl> > > http://www.daidalos.nl/ > > > > KvK 27164984 > > > > P Please consider the environment before printing this mail. > > De informatie - verzonden in of met dit e-mailbericht - is afkomstig van > Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit > bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan dit > bericht kunnen geen rechten worden ontleend. > > > >> From: >> general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com> > >> [mailto:general-boun...@developer.marklogic.com<mailto:general-boun...@developer.marklogic.com>] >> On Behalf Of > >> deepak mohan > >> Sent: zondag 28 maart 2010 17:44 > >> To: general@developer.marklogic.com<mailto:general@developer.marklogic.com> > >> Subject: [MarkLogic Dev General] Unique key construction > >> > >> Hi All, > >> > >> Please tell me how ML constructs the unique ID while creating > >> any ML entities(App Servers, DB, forest etc.). I need to > >> generate a unique ID. I tried dig into the ML Admin modules > >> APi, I couldnot find the algo. Are they using random() and > >> check for existence? > >> > >> Thanks, > >> Deepak Mohanakrishnan. > >> > >> > >> ________________________________ > >> > >> Your Mail works best with the New Yahoo Optimized IE8. Get it > >> NOW! > >> <http://in.rd.yahoo.com/tagline_ie8_new/*http://downloads.yaho<http://in.rd.yahoo.com/tagline_ie8_new/*http:/downloads.yaho> > >> o.com/in/internetexplorer/<http://o.com/in/internetexplorer/>> . > >> > > _______________________________________________ > > General mailing list > > General@developer.marklogic.com<mailto:General@developer.marklogic.com> > > http://xqzone.com/mailman/listinfo/general > > > NOTICE: This email message is for the sole use of the intended recipient(s) > and may contain confidential and privileged information. Any unauthorized > review, use, disclosure or distribution is prohibited. If you are not the > intended recipient, please contact the sender by reply email and destroy all > copies of the original message. > > > _______________________________________________ > General mailing list > General@developer.marklogic.com<mailto:General@developer.marklogic.com> > http://xqzone.com/mailman/listinfo/general _______________________________________________ General mailing list General@developer.marklogic.com<mailto:General@developer.marklogic.com> http://xqzone.com/mailman/listinfo/general _______________________________________________ General mailing list General@developer.marklogic.com<mailto:General@developer.marklogic.com> http://xqzone.com/mailman/listinfo/general
_______________________________________________ General mailing list General@developer.marklogic.com http://xqzone.com/mailman/listinfo/general