Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/part1/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@
# Все константы, зависящие от ёмкостей *_BITS, должны вычисляться из них.

# Twitter's original Snowflake epoch: 2010-11-04 01:42:54.657 UTC.
EPOCH_MS_DEFAULT: Final[int] = 0
EPOCH_MS_DEFAULT: Final[int] = 1288834974657

# Node identifier used when the caller does not supply one.
NODE_ID_DEFAULT: Final[int] = 0
NODE_ID_DEFAULT: Final[int] = 1

# Width of each field, in bits.
TIMESTAMP_BITS: Final[int] = 0
NODE_ID_BITS: Final[int] = 0
SEQUENCE_ID_BITS: Final[int] = 0
TIMESTAMP_BITS: Final[int] = 41
NODE_ID_BITS: Final[int] = 10
SEQUENCE_ID_BITS: Final[int] = 12

# Largest value each field can hold.
TIMESTAMP_MS_MAX: Final[int] = 0
NODE_ID_MAX: Final[int] = 0
SEQUENCE_ID_MAX: Final[int] = 0
TIMESTAMP_MS_MAX: Final[int] = 2**41 - 1
NODE_ID_MAX: Final[int] = 2**10 - 1
SEQUENCE_ID_MAX: Final[int] = 2**12 - 1

# Здесь можно добавить собственные вспомогательные константы
# (например, сдвиги полей при сборке идентификатора).
34 changes: 27 additions & 7 deletions src/part1/snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,17 @@
:func:`decode_node_id` and :func:`decode_sequence_id`.
"""

import time # noqa: F401
import time

from .constants import ( # noqa: F401
from .constants import (
# Epoch
EPOCH_MS_DEFAULT,
# Node ID
NODE_ID_BITS,
NODE_ID_DEFAULT,
NODE_ID_MAX,
# Sequence ID
SEQUENCE_ID_BITS,
SEQUENCE_ID_MAX,
TIMESTAMP_MS_MAX,
)
Expand All @@ -35,7 +40,8 @@ def read_current_millis(epoch_ms: int) -> int:
negative if ``epoch_ms`` lies in the future.
"""
# TODO: реализуйте функцию
return 0
a = (time.time_ns() // 1000000) - epoch_ms
return a


def decode_timestamp_ms(snowflake_id: int, epoch_ms: int = EPOCH_MS_DEFAULT) -> int:
Expand All @@ -51,7 +57,8 @@ def decode_timestamp_ms(snowflake_id: int, epoch_ms: int = EPOCH_MS_DEFAULT) ->
generated.
"""
# TODO: реализуйте функцию
return 0
epoch_time = snowflake_id >> (SEQUENCE_ID_BITS + NODE_ID_BITS)
return epoch_time + epoch_ms


def decode_node_id(snowflake_id: int) -> int:
Expand All @@ -65,7 +72,8 @@ def decode_node_id(snowflake_id: int) -> int:
``[0, NODE_ID_MAX]``.
"""
# TODO: реализуйте функцию
return 0
node_num = (snowflake_id >> SEQUENCE_ID_BITS) & NODE_ID_MAX
return node_num


def decode_sequence_id(snowflake_id: int) -> int:
Expand All @@ -79,7 +87,8 @@ def decode_sequence_id(snowflake_id: int) -> int:
the range ``[0, SEQUENCE_ID_MAX]``.
"""
# TODO: реализуйте функцию
return 0
seq_id = snowflake_id & SEQUENCE_ID_MAX
return seq_id


def generate_snowflake_id(
Expand Down Expand Up @@ -111,4 +120,15 @@ def generate_snowflake_id(
cases an explanatory message is printed to stdout first.
"""
# TODO: реализуйте функцию
return 0
if not (0 <= node_id <= NODE_ID_MAX):
print(f"node_id must be in [0, {NODE_ID_MAX}], got {node_id}")
return None
elif not (0 <= sequence_id <= SEQUENCE_ID_MAX):
print(f"sequence_id must be in [0, {SEQUENCE_ID_MAX}], got {sequence_id}")
return None
a = (time.time_ns() // 1000000) - epoch_ms
if a > TIMESTAMP_MS_MAX:
print("overflows")
return None
else:
return (a << NODE_ID_BITS + SEQUENCE_ID_BITS) | (node_id << SEQUENCE_ID_BITS) | sequence_id
Loading