aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/base32
diff options
context:
space:
mode:
authorNiek Sanders <niek.sanders@gmail.com>2017-06-15 09:38:57 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2018-06-12 22:51:30 +0000
commitb768d82d8e19493e287b9f6c3219cd253d3ccb42 (patch)
tree3919c0e45429bae6ff8e853fa302ad2118f2c30c /src/encoding/base32
parent3885e864114f9e45ed7d4322e0d802b897124c37 (diff)
downloadgo-b768d82d8e19493e287b9f6c3219cd253d3ccb42.tar.gz
go-b768d82d8e19493e287b9f6c3219cd253d3ccb42.zip
encoding/base32: eliminate alphabet bounds check
name old time/op new time/op delta EncodeToString-4 35.5µs ± 7% 33.3µs ± 6% -6.27% (p=0.008 n=10+9) DecodeString-4 120µs ± 7% 113µs ± 8% -5.88% (p=0.011 n=10+10) name old speed new speed delta EncodeToString-4 231MB/s ± 8% 247MB/s ± 5% +6.55% (p=0.008 n=10+9) DecodeString-4 109MB/s ± 7% 116MB/s ± 8% +6.27% (p=0.011 n=10+10) Change-Id: I60bf962464179e35b1711617adbc45a822eaece5 Reviewed-on: https://go-review.googlesource.com/45876 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/encoding/base32')
-rw-r--r--src/encoding/base32/base32.go26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go
index 60f25b04b2..3fb6caceab 100644
--- a/src/encoding/base32/base32.go
+++ b/src/encoding/base32/base32.go
@@ -21,7 +21,7 @@ import (
// introduced for SASL GSSAPI and standardized in RFC 4648.
// The alternate "base32hex" encoding is used in DNSSEC.
type Encoding struct {
- encode string
+ encode [32]byte
decodeMap [256]byte
padChar rune
}
@@ -37,8 +37,12 @@ const encodeHex = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
// NewEncoding returns a new Encoding defined by the given alphabet,
// which must be a 32-byte string.
func NewEncoding(encoder string) *Encoding {
+ if len(encoder) != 32 {
+ panic("encoding alphabet is not 32-bytes long")
+ }
+
e := new(Encoding)
- e.encode = encoder
+ copy(e.encode[:], encoder)
e.padChar = StdPadding
for i := 0; i < len(e.decodeMap); i++ {
@@ -129,17 +133,17 @@ func (enc *Encoding) Encode(dst, src []byte) {
size := len(dst)
if size >= 8 {
// Common case, unrolled for extra performance
- dst[0] = enc.encode[b[0]]
- dst[1] = enc.encode[b[1]]
- dst[2] = enc.encode[b[2]]
- dst[3] = enc.encode[b[3]]
- dst[4] = enc.encode[b[4]]
- dst[5] = enc.encode[b[5]]
- dst[6] = enc.encode[b[6]]
- dst[7] = enc.encode[b[7]]
+ dst[0] = enc.encode[b[0]&31]
+ dst[1] = enc.encode[b[1]&31]
+ dst[2] = enc.encode[b[2]&31]
+ dst[3] = enc.encode[b[3]&31]
+ dst[4] = enc.encode[b[4]&31]
+ dst[5] = enc.encode[b[5]&31]
+ dst[6] = enc.encode[b[6]&31]
+ dst[7] = enc.encode[b[7]&31]
} else {
for i := 0; i < size; i++ {
- dst[i] = enc.encode[b[i]]
+ dst[i] = enc.encode[b[i]&31]
}
}