pkg-perl-maintainers team mailing list archive
-
pkg-perl-maintainers team
-
Mailing list archive
-
Message #04972
[Bug 2073269] Re: Replace radsecret script to avoid new perl dependencies from universe
Of these three, I prefer the shell. (I know, I'm as surprised as you.)
Please use this version, unless there's a compelling reason to prefer
Python:
#!/bin/bash
data=$(dd if=/dev/urandom bs=1 count=13 2>/dev/null| base32 | tr 'A-Z' 'a-z')
echo ${data:0:4}-${data:4:4}-${data:8:4}-${data:12:4}-${data:16:4}
Why I prefer the shell version, and an important change I made to it:
The shell script executes in roughly 20% the time of the python scripts.
(4s vs 22s for 1000 iterations.)
We should be selecting 13 bytes, not 12, from /dev/urandom. (I'll show
why near the end.)
The very long python script has an unexpected behavior, so if this is
the version that is selected, it needs the same .rstrip('=') treatment
as the short one:
$ ./uuid1.py
376y-fuyc-d5a7-6sjz-uhwa-====
When playing with the shell script I thought I noticed patterns in the last character of the output so I investigated further to make sure that these are actually emitting roughly what we expect:
$ for i in `seq 1 10000`; do ./uuid ; done | ent -c
Value Char Occurrences Fraction
10 10000 0.040000
45 - 40000 0.160000
50 2 6056 0.024224
51 3 5860 0.023440
52 4 5946 0.023784
53 5 6102 0.024408
54 6 5951 0.023804
55 7 5731 0.022924
97 a 10761 0.043044
98 b 5887 0.023548
99 c 5847 0.023388
100 d 5938 0.023752
101 e 5929 0.023716
102 f 5936 0.023744
103 g 5922 0.023688
104 h 5934 0.023736
105 i 5940 0.023760
106 j 5834 0.023336
107 k 5997 0.023988
108 l 6005 0.024020
109 m 5940 0.023760
110 n 6026 0.024104
111 o 6081 0.024324
112 p 5909 0.023636
113 q 10947 0.043788
114 r 5918 0.023672
115 s 5892 0.023568
116 t 5908 0.023632
117 u 6033 0.024132
118 v 5912 0.023648
119 w 5934 0.023736
120 x 6067 0.024268
121 y 5892 0.023568
122 z 5965 0.023860
Total: 250000 1.000000
$ for i in `seq 1 10000`; do ./uuid1.py ; done | ent -c
Value Char Occurrences Fraction
10 10000 0.033333
45 - 50000 0.166667
50 2 5953 0.019843
51 3 5972 0.019907
52 4 5893 0.019643
53 5 5943 0.019810
54 6 5940 0.019800
55 7 5770 0.019233
61 = 40000 0.133333 # ====
97 a 10872 0.036240
98 b 6011 0.020037
99 c 5957 0.019857
100 d 5879 0.019597
101 e 5840 0.019467
102 f 5888 0.019627
103 g 5890 0.019633
104 h 5827 0.019423
105 i 5979 0.019930
106 j 5921 0.019737
107 k 5987 0.019957
108 l 5953 0.019843
109 m 6083 0.020277
110 n 5886 0.019620
111 o 6054 0.020180
112 p 5856 0.019520
113 q 10923 0.036410
114 r 6013 0.020043
115 s 5894 0.019647
116 t 6021 0.020070
117 u 6038 0.020127
118 v 5859 0.019530
119 w 5928 0.019760
120 x 6000 0.020000
121 y 5939 0.019797
122 z 6031 0.020103
Total: 300000 1.000000
$ for i in `seq 1 10000`; do ./uuid2.py ; done | ent -c
Value Char Occurrences Fraction
10 10000 0.040000
45 - 40000 0.160000
50 2 5967 0.023868
51 3 5954 0.023816
52 4 5864 0.023456
53 5 5849 0.023396
54 6 5967 0.023868
55 7 5985 0.023940
97 a 11095 0.044380
98 b 5892 0.023568
99 c 5963 0.023852
100 d 5847 0.023388
101 e 5909 0.023636
102 f 5939 0.023756
103 g 5893 0.023572
104 h 5938 0.023752
105 i 6000 0.024000
106 j 6019 0.024076
107 k 5887 0.023548
108 l 5947 0.023788
109 m 5935 0.023740
110 n 5965 0.023860
111 o 6186 0.024744
112 p 5999 0.023996
113 q 10918 0.043672
114 r 5966 0.023864
115 s 5755 0.023020
116 t 5820 0.023280
117 u 5935 0.023740
118 v 5858 0.023432
119 w 5881 0.023524
120 x 5997 0.023988
121 y 6039 0.024156
122 z 5831 0.023324
Total: 250000 1.000000
The output is far more balanced if we select 13 bytes, instead of 12:
$ cat uuid13
#!/bin/bash
data=$(dd if=/dev/urandom bs=1 count=13 2>/dev/null| base32 | tr 'A-Z' 'a-z')
echo ${data:0:4}-${data:4:4}-${data:8:4}-${data:12:4}-${data:16:4}
$ for i in `seq 1 10000`; do ./uuid13 ; done | ent -c
Value Char Occurrences Fraction
10 10000 0.040000
45 - 40000 0.160000
50 2 6208 0.024832
51 3 6378 0.025512
52 4 6241 0.024964
53 5 6384 0.025536
54 6 6273 0.025092
55 7 6217 0.024868
97 a 6214 0.024856
98 b 6185 0.024740
99 c 6279 0.025116
100 d 6235 0.024940
101 e 6174 0.024696
102 f 6230 0.024920
103 g 6213 0.024852
104 h 6230 0.024920
105 i 6305 0.025220
106 j 6296 0.025184
107 k 6218 0.024872
108 l 6200 0.024800
109 m 6316 0.025264
110 n 6291 0.025164
111 o 6260 0.025040
112 p 6145 0.024580
113 q 6409 0.025636
114 r 6347 0.025388
115 s 6233 0.024932
116 t 6157 0.024628
117 u 6131 0.024524
118 v 6192 0.024768
119 w 6302 0.025208
120 x 6251 0.025004
121 y 6242 0.024968
122 z 6244 0.024976
Total: 250000 1.000000
Entropy = 4.866248 bits per byte.
(The same change in the Python versions also improves their distribution
of outputs.)
Thanks
--
You received this bug notification because you are a member of Debian
Perl Group, which is subscribed to libconvert-base32-perl in Ubuntu.
https://bugs.launchpad.net/bugs/2073269
Title:
Replace radsecret script to avoid new perl dependencies from universe
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/freeradius/+bug/2073269/+subscriptions
Follow ups
References