RFC 1439

The Uniqueness of Unique Identifiers

๐Ÿ“… published March 1993, from ietf

RFC 1439: The Uniqueness of Unique Identifiers ๐Ÿฆ‹

Network Working Group ๐ŸŒธ Author: C. Finseth, University of Minnesota ๐Ÿ’… Date: March 1993 โœจ Category: Informational. This memo is giving info for the Internet community. It is not an Internet standard ๐ŸŽ€ Obsoletes / Updates: The original doesn't list any RFCs that it obsoletes or updates ๐Ÿงš


Status of This Memo ๐Ÿ’œ

Okay so, this memo just provides information for the Internet community. It is NOT a spec, so it doesn't define an Internet standard. You can share it as much as you want, distribution is unlimited ๐ŸŒˆ

Abstract โœจ

This RFC shares some info that could be helpful when you're picking a way to assign unique identifiers to people ๐Ÿซถ

1. The Issue ๐Ÿ’–

Okay bestie, so computer systems need a way to identify the people using them. These are usually called "user names" or "account names" ๐Ÿ“ The identifiers are typically short strings made of letters and numbers. And generally speaking, these identifiers have to be unique ๐Ÿ”ฅ

The uniqueness is usually achieved in one of three ways:

  1. The identifiers get assigned in a unique way that doesn't use any info about the actual person. Some examples look like:
ax54tv
cs00034

This method was super popular with big timesharing systems. It totally achieved uniqueness, but there was no way to guess someone's identifier unless you already knew it some other way ๐Ÿ™ˆ

  1. The identifiers get assigned in a unique way, where most of the identifier is built from the person's name. Some examples look like:
Craig.A.Finseth-1
Finseth1
caf-1
fins0001
  1. The identifiers are generally NOT assigned in a unique way. The identifier is built from the person's name, and if there's a duplicate, it gets handled in a kind of ad-hoc way. Some examples look like:
Craig.Finseth
caf

Now that we have widespread email, an important feature of an identifier system is being able to predict someone's identifier from other info about them. That other info is usually their name ๐Ÿ’Œ

Methods two and three make those predictions possible, especially if you have just one example of how a person's name maps to their identifier. Method two uses some or all of the name and changes it on purpose to make it unique (for example, by adding an integer at the end). Method three uses some or all of the name, and picks a different identifier when there's a duplicate ๐Ÿฆ‹

For both methods, it's really important to cut down on how often you need those uniqueness adjustments (an integer that isn't 1, or a totally different identifier). How likely an adjustment is depends on the identifier format and how big the organization is ๐Ÿ‘‘

2. Identifier Formats ๐ŸŽ€

There are a bunch of popular identifier formats. This section lists some of them and gives both typical and maximum values for how many possible identifiers each one can make. A "typical" value is the number you're likely to run into in real life. A "maximum" value is the biggest number of possible values you can get, without going totally extreme about it ๐Ÿงš All the ranges are written as a number of bits ๐Ÿ’œ

2.1 Initials โœจ

There are three popular formats based on initials: one, two, or three letters. (The number of people with more than three initials is assumed to be small.) Here are the values:

format                  typical         maximum

I                       4               5
II                      8               10
III                     12              15

You can also think of these as first, middle, and last initials:

I                       4               5
F L                     8               10
F M L                   12              15

2.2 Names ๐ŸŒธ

Again, there are three popular formats based on using names: the first name, the last name, and both first and last names together. Here are the values:

format                  typical         maximum

First                   8               14
Last                    9               13
First Last              17              27

2.3 Combinations ๐Ÿ’…

I've seen these combinations in use ("F" is the first initial, "M" is the middle initial, and "L" is the last initial):

format                  typical         maximum

F Last                  13              18
F M Last                17              23
First L                 12              19
First M Last            21              32

2.4 Complete List ๐Ÿฆ‹

Here are all the possible combinations of nothing, initial, and full name for first, middle, and last. The number of Middle names is assumed to be the same as the number of First names. Here are the values:

format                  typical         maximum

_ _ _                   0               0
_ _ L                   4               5
_ _ Last                9               13

_ M _                   4               5
_ M L                   5               10
_ M Last                13              18

_ Middle _              8               14
_ Middle L              12              19
_ Middle Last           17              27

F _ _                   4               5
F _ L                   5               10
F _ Last                13              18

F M _                   5               10
F M L                   12              15
F M Last                17              23

F Middle _              12              19
F Middle L              16              24
F Middle Last           21              32

First _ _               8               14
First _ L               12              19
First _ Last            17              27

First M _               12              19
First M L               16              24
First M Last            21              32

First Middle _          16              28
First Middle L          20              33
First Middle Last       26              40

And that's the first half of the tea! โ˜•๐Ÿ’– Section 3 is next, where we get into the math on how likely duplicates actually are, so stay tuned ๐ŸŒˆ๐Ÿงš

Appendix: Perl Program to Compute Probabilities ๐Ÿงฎโœจ

okay bestie, here's the actual code that did the math ๐Ÿ’… it's a little Perl script that loops over bit sizes from 6 to 31 and calls Compute for each one ๐Ÿฆ‹

#!/usr/local/bin/perl

for $bits (6..31) {
        &Compute($bits);
        }
exit(0);

# ------------------------------------------------------------

sub Compute {
        $bits = $_[0];
        $num = 1 << $bits;
        $cnt = $num;

        print "bits $bitsnumber $num:0;

        for ($prob = 1; $prob > 0.99; ) {
                $prob *= $cnt / $num;
                $cnt--;
                }

        print "", $num - $cnt, "$prob0;

        for (; $prob > 0.98; ) {

                $prob *= $cnt / $num;
                $cnt--;
                }
        print "", $num - $cnt, "$prob0;

        for (; $prob > 0.95; ) {
                $prob *= $cnt / $num;
                $cnt--;
                }
        print "", $num - $cnt, "$prob0;

        for (; $prob > 0.90; ) {
                $prob *= $cnt / $num;
                $cnt--;
                }
        print "", $num - $cnt, "$prob0;

        for (; $prob > 0.80; ) {
                $prob *= $cnt / $num;
                $cnt--;
                }
        print "", $num - $cnt, "$prob0;

        print "0;
        }

Appendix: Perl Program Output ๐Ÿ“Š๐ŸŒธ

here's what the script spit out ๐Ÿซถ each block starts with the bit size and the number of possible values (number), and then each line pairs a count with a probability ๐Ÿ“

bits 6  number 64:
        2       0.984375
        3       0.95361328125
        4       0.90891265869140625
        5       0.85210561752319335938
        6       0.78553486615419387817

bits 7  number 128:
        3       0.9766845703125
        3       0.9766845703125
        5       0.92398747801780700684
        6       0.88789421715773642063
        8       0.79999355674331695809

bits 8  number 256:
        3       0.988311767578125
        4       0.97672998905181884766
        6       0.94268989971169503406
        8       0.89542306910786462204
        12      0.76969425214152431547

bits 9  number 512:
        4       0.98832316696643829346
        6       0.97102570187075798458
        8       0.94652632751096643648
        11      0.89748056780293572476
        16      0.78916761796439427457

bits 10 number 1024:
        6       0.98543241551841020964
        7       0.97965839745873206645
        11      0.94753115178840541244
        16      0.88888866335604777014
        22      0.79677613655632184564

bits 11 number 2048:
        7       0.98978773152834598203
        10      0.97823367137821537476
        15      0.94990722378677450166
        22      0.89298119682681720288
        31      0.79597589885472519455

bits 12 number 4096:
        10      0.98906539062491305447
        14      0.97800426773009718762
        21      0.94994111694430838355
        30      0.89901365764115603874
        44      0.79312138620093930452

bits 13 number 8192:
        14      0.98894703242829806733
        19      0.97932692503837115439
        30      0.94822407309193512681
        43      0.89545741661906652631
        61      0.7993625840767998314

bits 14 number 16384:
        19      0.98961337517641645434
        27      0.97879319536756481668
        42      0.94876352395820107155
        60      0.89748107890372830209
        86      0.79973683158771624591

bits 15 number 32768:
        27      0.98934263776790121181
        37      0.97987304880641035165
        59      0.94909471808051404373
        84      0.89899774209805793923
        122     0.79809378598190949816

bits 16 number 65536:
        37      0.98988724065590050216
        52      0.97996496661944154649
        83      0.94937874420413270737
        118     0.89996948010355670711
        172     0.79884228150816105618

bits 17 number 131072:
        52      0.98993311138884398925
        74      0.97960010416289267088
        117     0.94952974978505377823
        167     0.89960828942716541956
        243     0.79894309171178368167

bits 18 number 262144:
        74      0.98974844864797828503
        104     0.97977315557223210174
        165     0.94968621078621640041
        236     0.8995926348279144058
        343     0.7994422793765953994

bits 19 number 524288:
        104     0.98983557888923057178
        147     0.97973841652874515962
        233     0.94974719445364064185
        333     0.89991342619657743729
        485     0.79936749144148444568

bits 20 number 1048576:
        146     0.98995567500195758015
        207     0.97987072919607220989
        329     0.94983990872655321702
        471     0.89980857451706741656
        685     0.79974215234216872172

bits 21 number 2097152:
        206     0.98998177463778547214
        292     0.97994400939715686771
        465     0.94985589918092261374
        666     0.89978055267663470396
        968     0.79994886751736571373

bits 22 number 4194304:
        291     0.98999013137747737812
        413     0.97991951242142538714
        657     0.94991674892578203959
        941     0.89991652739633254399
        1369    0.79989205747440361716

bits 23 number 8388608:
        412     0.98995762604049764022
        583     0.97997846530691334888
        929     0.94991024716640248826
        1330    0.89999961063320443877
        1936    0.79987028265451087794

bits 24 number 16777216:
        582     0.98997307486745211857
        824     0.97999203469417239809
        1313    0.94995516684099989835
        1881    0.89997049960675035152
        2737    0.79996700222056416063

bits 25 number 33554432:
        822     0.98999408609360783906
        1165    0.9799956928177964155
        1856    0.9499899669674316538
        2660    0.8999664414095410736
        3871    0.79992328289672998132

bits 26 number 67108864:
        1162    0.98999884535478044345
        1648    0.9799801637652703068
        2625    0.94997437525354821997
        3761    0.89999748465616635773
        5474    0.79993922903192515861

bits 27 number 134217728:
        1644    0.9899880636014986024
        2330    0.97998730103356856969
        3712    0.94997727934463771504
        5319    0.89998552434244594167
        7740    0.79999591580103557309

bits 28 number 268435456:
        2324    0.98999458855588851058
        3294    0.97999828329325222587
        5249    0.94998397932368705554
        7522    0.89998576049206902017
        10946   0.79999058777500076101

bits 29 number 536870912:
        3286    0.98999717306002099626
        4659    0.97999160965267329004
        7422    0.94999720388831232487
        10637   0.89999506567702891591
        15480   0.7999860979665908145

bits 30 number 1073741824:
        4647    0.98999674474047760775
        6588    0.97999531736215383937
        10496   0.94999806770951356061
        15043   0.89999250738244507275
        21891   0.79999995570982085358

bits 31 number 2147483648:
        6571    0.98999869761078929109
        9316    0.97999801528523688976
        14844   0.94999403283519279206
        21273   0.89999983631135749285
        30959   0.79999272222201334159

References ๐Ÿ“š๐ŸŽ€

Bruce Lansky (1984). The Best Baby Name Book. Deephaven, MN: Meadowbrook. ISBN 0-671-54463-2.

Lareina Rule (1988). Name Your Baby. Bantam. ISBN 0-553-27145-8.

Security Considerations ๐Ÿ”

Security issues are not discussed in this memo. ๐Ÿ™ˆ

Author's Address ๐Ÿ’Œ

Craig A. Finseth
Networking Services
Computer and Information Services
University of Minnesota
130 Lind Hall
207 Church St. SE
Minneapolis, MN 55455-0134

EMail: Craig.A.Finseth-1@umn.edu or
       fin@unet.umn.edu

Phone: +1 612 624 3375
Fax: +1 612 626 1002

And that's the whole RFC, bestie! ๐ŸŒˆ๐Ÿ‘‘ Craig did the maths so we didn't have to ๐Ÿ’œ

๐Ÿ“ฆ where this page comes from