Fast implementation of Git in pure Go
at master 53 lines 990 B view raw
1package read 2 3import ( 4 "bytes" 5 "encoding/binary" 6 7 "codeberg.org/lindenii/furgit/internal/intconv" 8 "codeberg.org/lindenii/furgit/objectid" 9) 10 11func layerLookup(layer *layer, oid objectid.ObjectID) (uint32, bool) { 12 hashSize := oid.Size() 13 first := int(oid.RawBytes()[0]) 14 15 var lo uint32 16 if first > 0 { 17 lo = binary.BigEndian.Uint32(layer.chunkOIDFanout[(first-1)*4 : first*4]) 18 } 19 20 hi := binary.BigEndian.Uint32(layer.chunkOIDFanout[first*4 : (first+1)*4]) 21 if hi == 0 || lo >= hi { 22 return 0, false 23 } 24 25 target := oid.RawBytes() 26 left := int(lo) 27 28 right := int(hi) - 1 29 for left <= right { 30 mid := left + (right-left)/2 31 start := mid * hashSize 32 end := start + hashSize 33 34 current := layer.chunkOIDLookup[start:end] 35 36 cmp := bytes.Compare(current, target) 37 switch { 38 case cmp == 0: 39 pos, err := intconv.IntToUint32(mid) 40 if err != nil { 41 return 0, false 42 } 43 44 return pos, true 45 case cmp < 0: 46 left = mid + 1 47 default: 48 right = mid - 1 49 } 50 } 51 52 return 0, false 53}