jsm
NoNoncense - generate globally unique nonces in distributed Elixir
Generate globally unique nonces (number-only-used-once) in distributed Elixir. These nonces are used to form the basis of an upcoming GUID generation package unique ID package Once, or in crypto operations that require nonces.
The nonces come in multiple types:
- counter nonces that are unique but predictable and can be generated incredibly quickly
- sortable nonces (Snowflake IDs) that have an accurate creation timestamp in their first bits
- encrypted nonces that are not just unique but also unpredictable
The nonces are guaranteed to be unique if:
- machine IDs are unique for each node
- individual machines maintain a somewhat accurate clock (specifically, the UTC clock has to have progressed between node restarts)
To aid with the unique machine IDs, NoNoncense.MachineId and its subsidiary conflict-detecting genserver NoNoncense.MachineId.ConflictGuard can be used. ConflictGuard requires connected nodes to function, but is an optional extra and the entire thing can also work without it.
It’s possible to use the nonces for cryptographic purposes like cipher IVs and generating Poly1305 one-time-keys. For usecases where a nonce is required that is not just unique but unpredictable, there is a uniqueness-preserving encrypted-nonce option. However, caveats apply, with 96-bits nonces in particular, you should read the NoNoncense module docs.
Last but not least, performance is great thanks to the use of Erlang primitives :persistent_term and :atomics. Plaintext nonces can be generated at rates of tens of millions of nonces per second ![]()
Package: no_noncense | Hex
Docs: NoNoncense v1.3.0 — Documentation
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #performance
- #security










Most Liked
jsm
After NoNoncense 0.x took the Elixir world by storm, ushering in a new generation of ID generation, one can barely imagine the feverish excitement of the wider ecosystem in the buildup to its 1.0 release. On this fine Christmas Day morning, the long wait is finally over.
NoNoncense 1.0 features:
init/1init/1, for example 128 bits nonces improved from 2.8M ops/s to 9M on one coreThe performance increase with the OTP ciphers is realized by caching the key expansion result, a.k.a. crypto_init reference. That also allows Blowfish to (vastly) outperform 3DES, which is why it is the new default cipher. More details on nonce encryption, including why Speck is a nice upgrade for 96 bits nonces, can be found in the Hex docs.
jsm
The related Ecto type has arrived!