| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package util
- // IsHighBitSet 判断最高位是否为 1(表/字段是否被删除)
- func IsHighBitSet(b byte) bool {
- return b&0x80 != 0
- }
- // SetHighBit 将最高位置 1(标记删除)
- func SetHighBit(b byte) byte {
- return b | 0x80
- }
- // BytesToString 字节数组转字符串(固定长度表名专用)
- func BytesToString(b []byte) string {
- for i := range b {
- if b[i] == 0 {
- return string(b[:i])
- }
- }
- return string(b)
- }
- // 工具函数:int64比较
- // 本组工具 (CompareInt64 / BinarySearch) 服务于时序索引:按 BeginTime 比较条目并在扁平索引页中二分定位分段。
- func CompareInt64(a, b int64) int {
- if a < b {
- return -1
- } else if a > b {
- return 1
- }
- return 0
- }
- // BinarySearch
- // 通用二分查找:适用于所有有序 []byte 连续存储的索引条目
- // entryLen: 单个条目长度
- // compare: 比较函数:mid条目数据 vs 目标key
- // 返回:找到的位置pos, 是否找到found
- func BinarySearch(
- entries []byte,
- entryLen int,
- key []byte,
- compare func(a, b []byte) int,
- ) (pos uint32, found bool) {
- n := len(entries) / entryLen
- if n == 0 {
- return 0, false
- }
- left := 0
- right := n - 1
- pos = uint32(n)
- for left <= right {
- mid := (left + right) >> 1
- start := mid * entryLen
- midEntry := entries[start : start+entryLen]
- cmp := compare(midEntry, key) // <--- 现在两个参数
- switch {
- case cmp == 0:
- return uint32(mid), true
- case cmp < 0:
- left = mid + 1
- default:
- right = mid - 1
- pos = uint32(mid)
- }
- }
- return pos, false
- }
|