diff --git a/hd/address.go b/hd/address.go index 28f70a98f..d7553a4d7 100644 --- a/hd/address.go +++ b/hd/address.go @@ -282,9 +282,20 @@ func CalcSha512(buf []byte) []byte { } func ReverseBytes(buf []byte) []byte { - res := []byte{} - for i := len(buf) - 1; i >= 0; i-- { - res = append(res, buf[i]) + var res []byte + if len(buf) == 0 { + return res + } + + // Walk till mid-way, swapping bytes from each end: + // b[i] and b[len-i-1] + blen := len(buf) + res = make([]byte, blen) + mid := blen / 2 + for left := 0; left <= mid; left++ { + right := blen - left - 1 + res[left] = buf[right] + res[right] = buf[left] } return res } diff --git a/hd/hd_test.go b/hd/hd_test.go index e771f14b6..b2f7d2e8f 100644 --- a/hd/hd_test.go +++ b/hd/hd_test.go @@ -89,6 +89,26 @@ func TestHDToAddr(t *testing.T) { } } +func TestReverseBytes(t *testing.T) { + tests := [...]struct { + v []byte + want []byte + }{ + {[]byte(""), []byte("")}, + {nil, nil}, + {[]byte("Tendermint"), []byte("tnimredneT")}, + {[]byte("T"), []byte("T")}, + {[]byte("Te"), []byte("eT")}, + } + + for i, tt := range tests { + got := ReverseBytes(tt.v) + if !bytes.Equal(got, tt.want) { + t.Errorf("#%d:\ngot= (%x)\nwant=(%x)", i, got, tt.want) + } + } +} + func ifExit(err error, n int) { if err != nil { fmt.Println(n, err) @@ -187,3 +207,36 @@ func tylerSmith(seed []byte) ([]byte, []byte, []byte) { pub := k.PublicKey().Key return masterKey.Key, priv, pub } + +// Benchmarks + +var revBytesCases = [][]byte{ + nil, + []byte(""), + + []byte("12"), + + // 16byte case + []byte("abcdefghijklmnop"), + + // 32byte case + []byte("abcdefghijklmnopqrstuvwxyz123456"), + + // 64byte case + []byte("abcdefghijklmnopqrstuvwxyz123456abcdefghijklmnopqrstuvwxyz123456"), +} + +func BenchmarkReverseBytes(b *testing.B) { + var sink []byte + for i := 0; i < b.N; i++ { + for _, tt := range revBytesCases { + sink = ReverseBytes(tt) + } + } + b.ReportAllocs() + + // sink is necessary to ensure if the compiler tries + // to smart, that it won't optimize away the benchmarks. + if sink != nil { + } +}