Skip to content

Commit 73e9043

Browse files
authored
Merge pull request #3 from ttys3/fixup-dict-encode
dict keys should be sorted before encode
2 parents dd0b375 + 8449960 commit 73e9043

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ coveralls:
44
test:
55
go test -v -race
66

7+
test-dict-encode:
8+
richgo test -v --count=1000 -run=TestMarshalUnOrderedDict
9+
710
bench:
811
go test -v -bench=. -run "^Benchmark"
912

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import bencode "github.com/IncSW/go-bencode"
1616
## Quick Start
1717

1818
```go
19-
data, err := Marshal(value)
19+
data, err := bencode.Marshal(value)
2020
```
2121

2222
```go
23-
data, err := Unmarshal(value)
23+
data, err := bencode.Unmarshal(value)
2424
```
2525

2626
## Performance

marshaler.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bencode
22

33
import (
44
"fmt"
5+
"sort"
56
"strconv"
67
)
78

@@ -164,10 +165,16 @@ func marshalDictionary(data map[string]interface{}, result *[]byte, offset int,
164165
(*result)[offset] = 'd'
165166
offset++
166167

167-
for key, data := range data {
168+
keys := make([]string, 0, len(data))
169+
for key, _ := range data {
170+
keys = append(keys, key)
171+
}
172+
sort.Strings(keys)
173+
174+
for _, key := range keys {
168175
offset, length = marshalBytes(s2b(key), result, offset, length)
169176
var err error
170-
offset, length, err = marshal(data, result, offset, length)
177+
offset, length, err = marshal(data[key], result, offset, length)
171178
if err != nil {
172179
return 0, 0, err
173180
}

marshaler_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ func TestMarshal(t *testing.T) {
5858
}
5959
}
6060

61+
func TestMarshalUnOrderedDict(t *testing.T) {
62+
assert := assert.New(t)
63+
unorderedEncodedData := []byte(`d7:ttg_tag32:8032a74ec22927a5bd6367537eafd87e7:privatei1e6:source20:[ttys3.bencode.test]e`)
64+
expectedReencodedData := []byte(`d7:privatei1e6:source20:[ttys3.bencode.test]7:ttg_tag32:8032a74ec22927a5bd6367537eafd87ee`)
65+
data, err := Unmarshal(unorderedEncodedData)
66+
assert.NoError(err)
67+
//t.Logf("decoded data: %#v", data)
68+
reencoded, err := Marshal(data)
69+
assert.NoError(err)
70+
assert.Equal(expectedReencodedData, reencoded)
71+
}
72+
6173
func BenchmarkMarshal(b *testing.B) {
6274
b.ReportAllocs()
6375
for n := 0; n < b.N; n++ {

0 commit comments

Comments
 (0)