[MarkLogic Dev General] uuid implementation in Xquery
Michael Blakeley
michael.blakeley at marklogic.com
Tue Aug 14 09:51:57 PDT 2007
Thanks, Tim. I had a side-bet on whether or not anyone would spot that,
and I'm glad you did.
Here's how I'd fix, just for comparison:
string-join(
for $i in 1 to 2
let $v := xdmp:integer-to-hex(xdmp:random())
let $len := string-length($v)
return
if ($len eq 32) then $v
else concat(string-pad('0', 16 - $len), $v)
, ''
)
-- Mike
Tim Finney wrote:
> 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
>>>
>>> gvidal at alm.com
>>>
>>>
>>>
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> General mailing list
>>> General at developer.marklogic.com
>>> http://xqzone.com/mailman/listinfo/general
>> _______________________________________________
>> General mailing list
>> General at developer.marklogic.com
>> http://xqzone.com/mailman/listinfo/general
>
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://xqzone.com/mailman/listinfo/general
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4532 bytes
Desc: S/MIME Cryptographic Signature
Url : http://xqzone.marklogic.com/pipermail/general/attachments/20070814/27a99f0d/smime.bin
More information about the General
mailing list