c25391e976
Create helper function to generate ranges of UUIDs, for parallelizing the segment loop. Change-Id: I17dbc1d5effe27fc1a3491aa9ca56c692bd95df0
45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
// Copyright (C) 2022 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package rangedloop
|
|
|
|
import (
|
|
"encoding/binary"
|
|
|
|
"storj.io/common/uuid"
|
|
)
|
|
|
|
// CreateUUIDBoundaries splits up the entire 128-bit UUID range into equal parts.
|
|
func CreateUUIDBoundaries(nRanges uint32) ([]uuid.UUID, error) {
|
|
if nRanges == 0 {
|
|
// every time this line is executed a mathematician feels a disturbance in the force
|
|
nRanges = 1
|
|
}
|
|
|
|
increment := uint32(1 << 32 / uint64(nRanges))
|
|
|
|
result := []uuid.UUID{}
|
|
|
|
for i := uint32(1); i < nRanges; i++ {
|
|
topBits := i * increment
|
|
|
|
newUuid, err := MakeUUIDWithTopBits(topBits)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result = append(result, newUuid)
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// MakeUUIDWithTopBits creates a zeroed UUID with the top 32 bits set from the input.
|
|
// Technically the result is not a UUID since it doesn't have the version and variant bits set.
|
|
func MakeUUIDWithTopBits(topBits uint32) (uuid.UUID, error) {
|
|
bytes := make([]byte, 16)
|
|
binary.BigEndian.PutUint32(bytes, topBits)
|
|
|
|
return uuid.FromBytes(bytes)
|
|
}
|