arnaucube
arnaucube/go-dhtPublic Self-hosted repository
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}