Пример #1
0
        public SnowflakeIdState(String idString, ISnowflakeId idGen)
        {
            IdString        = idString;
            _idGen          = idGen;
            MachineIdLength = _idGen.MaxMachineMask.ToString().Length;
            SequenceLength  = _idGen.SequenceMask.ToString().Length;

            #region UTC Convert

            var year        = int.Parse(idString.Substring(0, 4));
            var month       = int.Parse(idString.Substring(4, 2));
            var day         = int.Parse(idString.Substring(6, 2));
            var hour        = int.Parse(idString.Substring(8, 2));
            var minute      = int.Parse(idString.Substring(10, 2));
            var second      = int.Parse(idString.Substring(12, 2));
            var millisecond = int.Parse(idString.Substring(14, 3));
            UtcTime = new DateTimeOffset(year, month, day, hour, minute, second, millisecond, TimeSpan.Zero);

            #endregion

            var machineIdString = idString.Substring(17, MachineIdLength);
            MachineId = long.Parse(machineIdString);
            if (MachineId != _idGen.MachineId)
            {
                throw new ArgumentException($"MachineId:[{MachineId}] not Equal IdGen.MachineId:[{_idGen.MachineId}]",
                                            nameof(MachineId));
            }

            var sequenceString = idString.Substring(17 + MachineIdLength, SequenceLength);
            Sequence = long.Parse(sequenceString);
            var timestamp = UtcTime.ToUnixTimeMilliseconds();
            Id = ((timestamp - _idGen.Epoch) << _idGen.TimestampShift) | (MachineId << _idGen.SequenceBits) | Sequence;
        }
Пример #2
0
        public SnowflakeIdState(long id, ISnowflakeId idGen)
        {
            Id              = id;
            _idGen          = idGen;
            MachineIdLength = _idGen.MaxMachineMask.ToString().Length;
            SequenceLength  = _idGen.SequenceMask.ToString().Length;

            Sequence = Id & _idGen.SequenceMask;

            MachineId = (Id >> _idGen.SequenceBits) & _idGen.MaxMachineMask;
            if (MachineId != _idGen.MachineId)
            {
                throw new ArgumentException($"MachineId:[{MachineId}] not Equal IdGen.MachineId:[{_idGen.MachineId}]",
                                            nameof(MachineId));
            }

            UtcTime = _idGen.EpochTime.AddMilliseconds((Id >> _idGen.TimestampShift) & _idGen.TimestampMask);
            var machineIdFormat = $"D{MachineIdLength}";
            var sequenceFormat  = $"D{SequenceLength}";

            IdString =
                $"{UtcTime.ToString(TIME_FORMAT)}{MachineId.ToString(machineIdFormat)}{Sequence.ToString(sequenceFormat)}";
        }