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