1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package chord
- import (
- "bytes"
- "crypto/sha1"
- "errors"
- "math/rand"
- "time"
- )
- var (
- ERR_NO_SUCCESSOR = errors.New("cannot find successor")
- ERR_NODE_EXISTS = errors.New("node with id already exists")
- ERR_KEY_NOT_FOUND = errors.New("key not found")
- )
- func isEqual(a, b []byte) bool {
- return bytes.Compare(a, b) == 0
- }
- func isPowerOfTwo(num int) bool {
- return (num != 0) && ((num & (num - 1)) == 0)
- }
- func randStabilize(min, max time.Duration) time.Duration {
- r := rand.Float64()
- return time.Duration((r * float64(max-min)) + float64(min))
- }
- // check if key is between a and b, right inclusive
- func betweenRightIncl(key, a, b []byte) bool {
- return between(key, a, b) || bytes.Equal(key, b)
- }
- // Checks if a key is STRICTLY between two ID's exclusively
- func between(key, a, b []byte) bool {
- switch bytes.Compare(a, b) {
- case 1:
- return bytes.Compare(a, key) == -1 || bytes.Compare(b, key) >= 0
- case -1:
- return bytes.Compare(a, key) == -1 && bytes.Compare(b, key) >= 0
- case 0:
- return bytes.Compare(a, key) != 0
- }
- return false
- }
- // For testing
- func GetHashID(key string) []byte {
- h := sha1.New()
- if _, err := h.Write([]byte(key)); err != nil {
- return nil
- }
- val := h.Sum(nil)
- return val
- }
|