go-dht/kademlia/id.go
kademlia/id.goRaw
1package kademlia
2
3import (
4 "bytes"
5 "crypto/rand"
6 "encoding/hex"
7 "fmt"
8)
9
10type ID [B]byte
11
12func NewID() (ID, error) {
13 b := make([]byte, 32)
14 _, err := rand.Read(b)
15 if err != nil {
16 return ID{}, err
17 }
18 var id ID
19 copy(id[:], b[:B])
20 return id, nil
21}
22
23func (id ID) String() string {
24 return hex.EncodeToString(id[:])
25}
26
27func (id ID) MarshalText() ([]byte, error) {
28 return []byte(hex.EncodeToString(id[:])), nil
29}
30
31func (id *ID) UnmarshalText(data []byte) error {
32 fmt.Println("UNMARSHAL")
33 fmt.Println("d", string(data))
34 var err error
35 var idFromStr ID
36 idFromStr, err = IDFromString(string(data))
37 if err != nil {
38 return err
39 }
40 copy(id[:], idFromStr[:])
41 return nil
42}
43
44func IDFromString(s string) (ID, error) {
45 b, err := hex.DecodeString(s)
46 if err != nil {
47 return ID{}, err
48 }
49 var id ID
50 copy(id[:], b[:B])
51 return id, nil
52}
53
54func (idA ID) Equal(idB ID) bool {
55 return bytes.Equal(idA[:], idB[:])
56}
57
58// Cmp returns true if idA > idB
59func (idA ID) Cmp(idB ID) bool {
60 for i := 0; i < len(idA); i++ {
61 if idA[i] != idB[i] {
62 return idA[i] > idB[i]
63 }
64 }
65 return false
66}
67
68func (idA ID) Distance(idB ID) ID {
69 var d ID
70 for i := 0; i < B; i++ {
71 d[i] = idA[i] ^ idB[i]
72 }
73 return d
74}