util.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package chord
  2. import (
  3. "bytes"
  4. "crypto/sha1"
  5. "errors"
  6. "math/rand"
  7. "time"
  8. )
  9. var (
  10. ERR_NO_SUCCESSOR = errors.New("cannot find successor")
  11. ERR_NODE_EXISTS = errors.New("node with id already exists")
  12. ERR_KEY_NOT_FOUND = errors.New("key not found")
  13. )
  14. func isEqual(a, b []byte) bool {
  15. return bytes.Compare(a, b) == 0
  16. }
  17. func isPowerOfTwo(num int) bool {
  18. return (num != 0) && ((num & (num - 1)) == 0)
  19. }
  20. func randStabilize(min, max time.Duration) time.Duration {
  21. r := rand.Float64()
  22. return time.Duration((r * float64(max-min)) + float64(min))
  23. }
  24. // check if key is between a and b, right inclusive
  25. func betweenRightIncl(key, a, b []byte) bool {
  26. return between(key, a, b) || bytes.Equal(key, b)
  27. }
  28. // Checks if a key is STRICTLY between two ID's exclusively
  29. func between(key, a, b []byte) bool {
  30. switch bytes.Compare(a, b) {
  31. case 1:
  32. return bytes.Compare(a, key) == -1 || bytes.Compare(b, key) >= 0
  33. case -1:
  34. return bytes.Compare(a, key) == -1 && bytes.Compare(b, key) >= 0
  35. case 0:
  36. return bytes.Compare(a, key) != 0
  37. }
  38. return false
  39. }
  40. // For testing
  41. func GetHashID(key string) []byte {
  42. h := sha1.New()
  43. if _, err := h.Write([]byte(key)); err != nil {
  44. return nil
  45. }
  46. val := h.Sum(nil)
  47. return val
  48. }