]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/base32: eliminate alphabet bounds check
authorNiek Sanders <niek.sanders@gmail.com>
Thu, 15 Jun 2017 16:38:57 +0000 (09:38 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 12 Jun 2018 22:51:30 +0000 (22:51 +0000)
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>
src/encoding/base32/base32.go

index 60f25b04b22f48612f5c3f6972c545f96f5e79df..3fb6caceab485684225135c6db48151a01451dd1 100644 (file)
@@ -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]
                        }
                }