utils.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package util
  2. // IsHighBitSet 判断最高位是否为 1(表/字段是否被删除)
  3. func IsHighBitSet(b byte) bool {
  4. return b&0x80 != 0
  5. }
  6. // SetHighBit 将最高位置 1(标记删除)
  7. func SetHighBit(b byte) byte {
  8. return b | 0x80
  9. }
  10. // BytesToString 字节数组转字符串(固定长度表名专用)
  11. func BytesToString(b []byte) string {
  12. for i := range b {
  13. if b[i] == 0 {
  14. return string(b[:i])
  15. }
  16. }
  17. return string(b)
  18. }
  19. // 工具函数:int64比较
  20. // 本组工具 (CompareInt64 / BinarySearch) 服务于时序索引:按 BeginTime 比较条目并在扁平索引页中二分定位分段。
  21. func CompareInt64(a, b int64) int {
  22. if a < b {
  23. return -1
  24. } else if a > b {
  25. return 1
  26. }
  27. return 0
  28. }
  29. // BinarySearch
  30. // 通用二分查找:适用于所有有序 []byte 连续存储的索引条目
  31. // entryLen: 单个条目长度
  32. // compare: 比较函数:mid条目数据 vs 目标key
  33. // 返回:找到的位置pos, 是否找到found
  34. func BinarySearch(
  35. entries []byte,
  36. entryLen int,
  37. key []byte,
  38. compare func(a, b []byte) int,
  39. ) (pos uint32, found bool) {
  40. n := len(entries) / entryLen
  41. if n == 0 {
  42. return 0, false
  43. }
  44. left := 0
  45. right := n - 1
  46. pos = uint32(n)
  47. for left <= right {
  48. mid := (left + right) >> 1
  49. start := mid * entryLen
  50. midEntry := entries[start : start+entryLen]
  51. cmp := compare(midEntry, key) // <--- 现在两个参数
  52. switch {
  53. case cmp == 0:
  54. return uint32(mid), true
  55. case cmp < 0:
  56. left = mid + 1
  57. default:
  58. right = mid - 1
  59. pos = uint32(mid)
  60. }
  61. }
  62. return pos, false
  63. }