Given a requirement of generating a temporary passphrase that can be communicated over the phone to another person, I thought of XKCD #936 which suggests using four random words together as a passphrase. Then there’s just the question of how to generate that easily.
On each system there’s a file containing a list of words somewhere, on OS X it’s located at /usr/share/dict/words . This contains a good ~236,000 words on my machine so that seems like a good enough corpus to pull our four words from. We could take the easy route and lean on gnu sort to sort the file randomly & then take the top four words using head :
$ gsort -R /usr/share/dict/words | head -n4 | xargs fountained irretraceable unoil barylaliaThis works, but isn’t that performant (takes nearly 5 seconds on my machine.) There should be a more performant way to do this, we’re just reading a file in as a list & picking four random elements from said list. How about we lean on awk instead:
$ awk ' BEGIN { srand() } { words[NR] = $0 } END { for (i = 1; i <= 4; i++) { f = "%s " if (i == 4) { f = "%s" } printf f, words[int(rand() * NR)] } }' /usr/share/dict/words swording memorability sneakingness readilyThis runs in around 350ms on the same machine, which is a nice speedup and quick enough it feels near-instant.
Next time you need to generate a random passphrase, remember our old friend awk !