arnaucube
arnaucube/go-dhtPublic Self-hosted repository
go-dht/id.go
id.goRaw
 1package main
 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}