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

Reply via email to