Added the new and distributed NumGen, which replaces the old one. The old implementation was based on a master server.
40 lines
990 B
Go
40 lines
990 B
Go
package NumGen
|
|
|
|
import (
|
|
"math/big"
|
|
)
|
|
|
|
// Internal function to generate a unique ID with the given sequenceNumber.
|
|
func generateUniqueID(sequenceNumber int) (id int64) {
|
|
|
|
// Ensure, that the sequenceNumber is not smaller than 0:
|
|
if sequenceNumber < 0 {
|
|
sequenceNumber = sequenceNumber * -1
|
|
}
|
|
|
|
// Ensure, that the sequenceNumber is not bigger than 999:
|
|
if sequenceNumber > 999 {
|
|
sequenceNumber = 999
|
|
}
|
|
|
|
// Convert the sequenceNumber to a 64 bit integer:
|
|
seq := int64(sequenceNumber)
|
|
|
|
// Generate the first and second part of the ID:
|
|
timeID := generateTimeID() // First part
|
|
machineID := generateMachineID() // Second part
|
|
|
|
// Convert all numbers to big integers:
|
|
bigSEQ := big.NewInt(seq)
|
|
bigMachineID := big.NewInt(machineID)
|
|
bigTimeID := big.NewInt(timeID)
|
|
|
|
// Add the parts to get the result:
|
|
bigResult := bigTimeID.Add(bigTimeID, bigMachineID)
|
|
bigResult = bigResult.Add(bigResult, bigSEQ)
|
|
|
|
// The result as 64 bit integer:
|
|
id = bigResult.Int64()
|
|
return
|
|
}
|