diff options
author | Niek Sanders <niek.sanders@gmail.com> | 2017-06-15 09:38:57 -0700 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2018-06-12 22:51:30 +0000 |
commit | b768d82d8e19493e287b9f6c3219cd253d3ccb42 (patch) | |
tree | 3919c0e45429bae6ff8e853fa302ad2118f2c30c /src/encoding/base32 | |
parent | 3885e864114f9e45ed7d4322e0d802b897124c37 (diff) | |
download | go-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.go | 26 |
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] } } |