google / uuid

Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services.
BSD 3-Clause "New" or "Revised" License
5.24k stars 363 forks source link

Add `ReadRandom` and reimplement `NewRandomFromReader` using it #89

Open joewreschnig opened 3 years ago

joewreschnig commented 3 years ago

Combined with e.g. bufio.Reader this provides fast zero-allocation UUID generation if you do not consider heap memory particularly sensitive, without a global state or lock.

I guess this is my proposal re. the discussion about #80/#86/#88. It's faster than both of them and the single new function opens up other optimization possibilities they don't, e.g. if you already have some pathological [1000]UUID you need to fill.

I didn't remove the original pool implementation because in the end that's a question of the module's specific commitment to its API compatibility rather than a technical one.

rittneje commented 3 years ago

As mentioned in https://github.com/google/uuid/pull/88#issuecomment-890388714 this does not address the ever-growing number of constructors in this package. It also means someone intending to use crypto/rand.Rand has to explicitly pass it in order to gain any performance benefit from this.

rittneje commented 3 years ago

I didn't remove the original pool implementation because in the end that's a question of the module's specific commitment to its API compatibility rather than a technical one.

There is also the fact that it could sneakily be enabled by some transitive dependency. One of many reasons I chose to throw it out.