Michael's solution won't work if xdmp:random() happens to return two
small numbers. For example, the following produces nothing:

let $x := concat(
  xdmp:integer-to-hex(random(100)),
  xdmp:integer-to-hex(random(100))
)
return substring($x, 21, 12)

It can be fixed by testing for a minimum string length for $x then
calling the function again if the test fails:

return
  if (string-length($x < 32))
  then generate-uuid-v4()
  else string-join((substring($x, 1, 8),...), "-")



Otherwise, you could try something like this


(: Functions :)

define function random-hex(
  $length as xs:integer
) as xs:string {
  string-join(
    for $n in 1 to $length
    return xdmp:integer-to-hex(xdmp:random(15)),
    ""
  )
}

define function generate-uuid-v4() as xs:string {
  string-join(
    (
      random-hex(8),
      random-hex(4),
      random-hex(4),
      random-hex(4),
      random-hex(12)
    ),
    "-"
  )
}

(: Query :)

generate-uuid-v4()



Best

Tim Finney
UVa Press

On Fri, 2007-08-10 at 16:01 -0700, Michael Blakeley wrote:
> I happen to have one in front of me right now. Note that there are at 
> least five flavors of UUID - I chose to implement type-4.
> 
> (: this is a v4 UUID :)
> define function generate-uuid-v4()
>   as xs:string
> {
>    let $x := concat(
>      xdmp:integer-to-hex(xdmp:random()),
>      xdmp:integer-to-hex(xdmp:random())
>    )
>    return string-join((
>      substring($x, 1, 8), substring($x, 9, 4),
>      substring($x, 13, 4), substring($x, 17, 4), substring($x, 21, 14)
>      ), '-'
>    )
> }
> 
> Ref: http://en.wikipedia.org/wiki/UUID
> 
> -- Mike
> 
> Gary Vidal wrote:
> >  
> > 
> > I was wondering if anybody has implemented a uuid (universally unique
> > identifier) function in Xquery.  I would like to use this to generate
> > id's or a comparable id generation scheme
> > 
> >  
> > 
> > Regards,
> > 
> >  
> > 
> > Gary Vidal
> > 
> > Sr. .Net Developer
> > 
> > Tel: 212-592-4946
> > 
> > [EMAIL PROTECTED]
> > 
> >  
> > 
> > 
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > _______________________________________________
> > General mailing list
> > [email protected]
> > http://xqzone.com/mailman/listinfo/general
> 
> _______________________________________________
> General mailing list
> [email protected]
> http://xqzone.com/mailman/listinfo/general

_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to