Use a custom error type for invalid lengths, replacing `fmt.Errorf` (#69)

* Add benchmarks for different kinds of invalid UUIDs

Also add a test case for too-short UUIDs to ensure behavior doesn’t
change.

* Use a custom error type for invalid lengths, replacing `fmt.Errorf`

This significantly improves the speed of failed parses due to wrong
lengths. Previously the `fmt.Errorf` call dominated, making this the
most expensive error and more expensive than successfully parsing:

    BenchmarkParse-4                 29226529        36.1 ns/op
    BenchmarkParseBadLength-4         6923106       174 ns/op
    BenchmarkParseLen32Truncated-4   26641954        38.1 ns/op
    BenchmarkParseLen36Corrupted-4   19405598        59.5 ns/op

When the formatting is not required and done on-demand, the failure per
se is much faster:

    BenchmarkParse-4                 29641700        36.3 ns/op
    BenchmarkParseBadLength-4        58602537        20.0 ns/op
    BenchmarkParseLen32Truncated-4   30664791        43.6 ns/op
    BenchmarkParseLen36Corrupted-4   18882410        61.9 ns/op
2 files changed
tree: 31b3c19e592b1f2a127d955cdbb09c5073e4eaa7
  1. .travis.yml
  2. CONTRIBUTING.md
  3. CONTRIBUTORS
  4. dce.go
  5. doc.go
  6. go.mod
  7. hash.go
  8. json_test.go
  9. LICENSE
  10. marshal.go
  11. node.go
  12. node_js.go
  13. node_net.go
  14. README.md
  15. seq_test.go
  16. sql.go
  17. sql_test.go
  18. time.go
  19. util.go
  20. uuid.go
  21. uuid_test.go
  22. version1.go
  23. version4.go
README.md

uuid build status

The uuid package generates and inspects UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services.

This package is based on the github.com/pborman/uuid package (previously named code.google.com/p/go-uuid). It differs from these earlier packages in that a UUID is a 16 byte array rather than a byte slice. One loss due to this change is the ability to represent an invalid UUID (vs a NIL UUID).

Install

go get github.com/google/uuid

Documentation

GoDoc

Full go doc style documentation for the package can be viewed online without installing this package by using the GoDoc site here: http://pkg.go.dev/github.com/google/uuid