The use of both the @USER.NO and the current PID ensure the UUID is unique across the installation, and the presence of the UV system id makes the UUID unique between systems. The named common ensures the current port does not generate the same UUID within the same second/millisecond.
-----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of u2ug Sent: Thursday, 27 January 2011 11:19 PM To: U2 Users List Subject: Re: [U2] UUID [was Data in Dict] This is only guaranteed to be unique "per process" due to the usage of named common. Different processes running on the same system could generate duplicate values. -----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Gregor Scott Sent: January 26, 2011 07:35 PM To: U2 Users List Subject: Re: [U2] UUID [was Data in Dict] Interesting trade-off between the overhead of calculating a unique-yet compact sequential number and calculating a consistently long UUID. We use the "last-number-stored-in-a-file" method. We recently had need for a UUID as part of an XML exchange with a third party. I looked at the various options available, and eventually ended up writing a UV subroutine to create a UUID in v4 format. It is not overly complex - the hardest part was working out the bit manipulations needed. The result is unique across UV systems due to the use of the UV system id. ------------------------------------------------- subroutine MAKE.UUID( UUID ) * * This subroutine generates a version 4 UUID, following the * rules outlined in the RFC found here: * http://tools.ietf.org/html/rfc4122.html * common /UUID$GEN/ UUID$lastgen if unassigned(UUID$lastgen) then UUID$lastgen = '' DECLARE GCI getpid time.NOW = system(12) date.NOW = date() date.BASE = iconv( "15 Oct 1582", "D") * We need to determine the accuracy of the time value * From this we derive the appropriate factor to apply to * convert our time from seconds/milliseconds to nanoseconds if index( time.NOW, ".", 1) then * The TIME.MILLISECOND compiler option is NOT active time.NOW = time.NOW * 10000 nano.FACTOR = 100000 time.PERDAY = 86400 * 10000 end else * The TIME.MILLISECOND compiler option IS active nano.FACTOR = 1000000 time.PERDAY = 86400 * 1000 end * We need to ensure we can cope if we create more than 1 UUID * in the same millisecond. this.STAMP = date.NOW:"-":time.NOW * Need to use 'compare' on large 'numbers'. * A result of 0 means they are equal if compare( this.STAMP, field( UUID$lastgen, ".", 1)) = 0 then * We have already created one this (milli)second. TAIL = oconv( field( UUID$lastgen, ".", 2), "MCN") + 0 if TAIL then TAIL += 1 this.STAMP = fieldstore( UUID$lastgen, ".", 2, 1, TAIL) end else TAIL = 1 this.STAMP := ".1" end time.NOW += (TAIL / 10) end * Track our latest generation UUID$lastgen = this.STAMP * Now we can build our UUID time.UUID = ((date.NOW - date.BASE) * time.PERDAY) + time.NOW nano.UUID = time.UUID * nano.FACTOR port.NOW = abs(@USERNO) port.HEX = oconv( port.NOW, "MCDX")"R%4" ver.VAL = rnd(65535) ver.VAL = bitreset( ver.VAL, 12) ver.VAL = bitset( ver.VAL, 13) ver.VAL = bitreset( ver.VAL, 14) ver.VAL = bitreset( ver.VAL, 15) ver.HEX = oconv( ver.VAL, "MCDX") rnd.VAL = rnd(255) rsvd.VAL = bitset( rnd.VAL, 6) rsvd.VAL = bitreset( rsvd.VAL, 7) rsvd.HEX = oconv( rsvd.VAL, "MCDX") sysid.HEX = oconv( system(31), "MCDX")"R%6" pid.NOW = getpid() pid.HEX = oconv( pid.NOW, "MCDX")"R%6" * UUID Structure * <1> = <time-low> : 8 char hex value for time * <2> = <time-mid> : 4 char hex value * <3> = <time-hi-and_version> : 4 char hex value * <4> = <clock-seq-and-reserved> : 2 char hex value : <clock-seq-low> : 2 char hex value * <5> = <node> : 12 char hex value UUID = '' UUID<1> = oconv(nano.UUID, "MCDX")"R%8" UUID<2> = port.HEX UUID<3> = ver.HEX UUID<4> = rsvd.HEX:oconv(rnd(255), "MCDX")"R%2" UUID<5> = sysid.HEX:pid.HEX convert @AM to "-" in UUID return ------------------------------------------------- -----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Dan McGrath Sent: Thursday, 27 January 2011 10:46 AM To: U2 Users List Subject: Re: [U2] UUID [was Data in Dict] We also are using a form of UUID instead of sequential numbering on most of our new files. A lot easier to handle and makes maintenance easier. Thanks for the Stuart, I wasn't aware of that. For those using UniData, you can use the VOC as follows instead: UUID 0001 S 0002 !/etc/ncs/uuid_gen -----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Boydell, Stuart Sent: Thursday, 27 January 2011 10:07 AM To: U2 Users List Subject: Re: [U2] UUID [was Data in Dict] Most OSs have a call available for generating a UUID (Universally Unique ID) or GUID (Microsoft's acronym for Globally Unique ID). By definition and accepted generation standards these are almost guaranteed (!) to be unique (the probability of a clash is extremely small) across all computers. In UV you could use GCI to create a UV verb to invoke the OS call. Or just create a VOC item which you can execute and capture. There are usually options which affect the format of the output. For AIX the VOC item might look like this: UUID 0001 V 0002 /etc/ncs/uuid_gen 0003 U 0004 CGHIM For Linux use: /usr/bin/uuidgen For Windows (not installed by default): guidgen HTH -----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of David Wolverton Sent: Thursday, 27 January 2011 01:55 To: 'U2 Users List' Subject: Re: [U2] Data in Dict I'm curious what your logic is to generate the Unique ID -- can you share that without giving away a trade secret?? It's too bad it's not a database function call in UniData/UniVerse - we can do that in D3/Pick - it's a derivation of system Date/Time with AlphaSequencing if more than 1 hit in a given clock cycle - but it would only be unique on the 'machine' since another system could generate the same ID. So I am interested in the idea of generating a TRULY unique ID. DW -----Original Message----- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Steve Romanow Sent: Tuesday, January 25, 2011 7:24 PM To: U2 Users List Subject: Re: [U2] Data in Dict In some cases I am becoming a fan of UUIDs for db table keys. A UUID type one uses the mac address of the host along with the current time as salt so you don't have to worry about key collisions between accounts (I.e. TEST and PROD). Generating the next key is fast because there is no readu, update, write. They should hash pretty well since they are long and random. _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users ______________________________________________________________________ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email ______________________________________________________________________ ######################################################################## ################### The information transmitted in this message and attachments (if any) is intended only for the person or entity to which it is addressed. The message may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of or taking of any action in reliance upon this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer. The intended recipient of this e-mail may only use, reproduce, disclose or distribute the information contained in this e-mail and any attached files with the permission of IMB. ######################################################################## ################### _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users -- Message protected by DealerGuard: e-mail anti-virus, anti-spam and content filtering. http://www.pentanasolutions.com Click here to report this message as spam: https://login.mailguard.com.au/report/1BAEgE3GKH/7zQqhc0y0YR7mTW04Avx4o/ 3.053 This email and any attachments to it are confidential. You must not use, disclose or act on the email if you are not the intended recipient. Liability limited by a scheme approved under Professional Standards Legislation. _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users -- Message protected by DealerGuard: e-mail anti-virus, anti-spam and content filtering. http://www.pentanasolutions.com Click here to report this message as spam: https://login.mailguard.com.au/report/1BARAEHxbY/2eF4mxsPKl9ehZXGBYMOvf/3.6 This email and any attachments to it are confidential. You must not use, disclose or act on the email if you are not the intended recipient. Liability limited by a scheme approved under Professional Standards Legislation. _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users