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