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

* 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
  6. dce.go
  7. doc.go
  8. go.mod
  9. hash.go
  10. json_test.go
  11. marshal.go
  12. node.go
  13. node_js.go
  14. node_net.go
  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

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 package (previously named 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).


go get



Full go doc style documentation for the package can be viewed online without installing this package by using the GoDoc site here: