From 31764411b9a4481d5de371ff9878f9d3e8cb8fc2 Mon Sep 17 00:00:00 2001 From: Kiriil Date: Tue, 22 Sep 2026 18:33:22 +0300 Subject: [PATCH 1/6] Update constants.py --- src/part1/constants.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/part1/constants.py b/src/part1/constants.py index 9abfbba2..8d49454a 100644 --- a/src/part1/constants.py +++ b/src/part1/constants.py @@ -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 # Здесь можно добавить собственные вспомогательные константы # (например, сдвиги полей при сборке идентификатора). From 259056ff644225d62a69d3bd7263c46e0d51be70 Mon Sep 17 00:00:00 2001 From: Kiriil Date: Tue, 22 Sep 2026 18:49:01 +0300 Subject: [PATCH 2/6] Update snowflake.py --- src/part1/snowflake.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/part1/snowflake.py b/src/part1/snowflake.py index d3abf050..88c26f9b 100644 --- a/src/part1/snowflake.py +++ b/src/part1/snowflake.py @@ -35,7 +35,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: From bf69af282104c28c3866c4ae052a07a29b68f8ca Mon Sep 17 00:00:00 2001 From: Kiriil Date: Tue, 22 Sep 2026 23:42:50 +0300 Subject: [PATCH 3/6] Update snowflake.py --- src/part1/snowflake.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/part1/snowflake.py b/src/part1/snowflake.py index 88c26f9b..46efd267 100644 --- a/src/part1/snowflake.py +++ b/src/part1/snowflake.py @@ -21,6 +21,8 @@ NODE_ID_MAX, SEQUENCE_ID_MAX, TIMESTAMP_MS_MAX, + NODE_ID_BITS, + SEQUENCE_ID_BITS, ) @@ -52,7 +54,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: @@ -66,7 +69,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: @@ -80,7 +84,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( @@ -112,4 +117,10 @@ def generate_snowflake_id( cases an explanatory message is printed to stdout first. """ # TODO: реализуйте функцию + if 0<=node_id<=NODE_ID_MAX: + return "node_id must be in [0, NODE_ID_MAX]" + else if 0 <= sequence_id <= SEQUENCE_ID_MAX: + return "sequence_id must be in [0, SEQUENCE_ID_MAX]" + else: + return 0 From 316aee5036e7824ac620e0ed4bee8c2833f34486 Mon Sep 17 00:00:00 2001 From: Kirill Date: Wed, 23 Sep 2026 00:18:53 +0300 Subject: [PATCH 4/6] Finished homework --- src/part1/snowflake.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/part1/snowflake.py b/src/part1/snowflake.py index 46efd267..6888cc4c 100644 --- a/src/part1/snowflake.py +++ b/src/part1/snowflake.py @@ -117,10 +117,15 @@ def generate_snowflake_id( cases an explanatory message is printed to stdout first. """ # TODO: реализуйте функцию - if 0<=node_id<=NODE_ID_MAX: - return "node_id must be in [0, NODE_ID_MAX]" - else if 0 <= sequence_id <= SEQUENCE_ID_MAX: - return "sequence_id must be in [0, SEQUENCE_ID_MAX]" + a = (time.time_ns() // 1000000) - epoch_ms + 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 + if a > TIMESTAMP_MS_MAX: + print("overflows") + return None else: - - return 0 + return (a << 22) | (node_id << 12) | sequence_id \ No newline at end of file From da22fa8bc7f17f1ff645af961f74a6931f68d333 Mon Sep 17 00:00:00 2001 From: Kirill Date: Wed, 23 Sep 2026 00:47:35 +0300 Subject: [PATCH 5/6] Finished homework --- src/part1/constants.py | 6 +++--- src/part1/snowflake.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/part1/constants.py b/src/part1/constants.py index 8d49454a..22c27cee 100644 --- a/src/part1/constants.py +++ b/src/part1/constants.py @@ -30,9 +30,9 @@ SEQUENCE_ID_BITS: Final[int] = 12 # Largest value each field can hold. -TIMESTAMP_MS_MAX: Final[int] = 2**41-1 -NODE_ID_MAX: Final[int] = 2**10-1 -SEQUENCE_ID_MAX: Final[int] = 2**12-1 +TIMESTAMP_MS_MAX: Final[int] = 2**41 - 1 +NODE_ID_MAX: Final[int] = 2**10 - 1 +SEQUENCE_ID_MAX: Final[int] = 2**12 - 1 # Здесь можно добавить собственные вспомогательные константы # (например, сдвиги полей при сборке идентификатора). diff --git a/src/part1/snowflake.py b/src/part1/snowflake.py index 6888cc4c..145fa740 100644 --- a/src/part1/snowflake.py +++ b/src/part1/snowflake.py @@ -13,16 +13,19 @@ :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, - NODE_ID_BITS, - SEQUENCE_ID_BITS, ) @@ -54,7 +57,7 @@ def decode_timestamp_ms(snowflake_id: int, epoch_ms: int = EPOCH_MS_DEFAULT) -> generated. """ # TODO: реализуйте функцию - epoch_time = snowflake_id >> (SEQUENCE_ID_BITS+NODE_ID_BITS) + epoch_time = snowflake_id >> (SEQUENCE_ID_BITS + NODE_ID_BITS) return epoch_time + epoch_ms @@ -118,14 +121,14 @@ def generate_snowflake_id( """ # TODO: реализуйте функцию a = (time.time_ns() // 1000000) - epoch_ms - if not (0<=node_id<=NODE_ID_MAX): + 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): + elif not (0 <= sequence_id <= SEQUENCE_ID_MAX): print(f"sequence_id must be in [0, {SEQUENCE_ID_MAX}], got {sequence_id}") return None if a > TIMESTAMP_MS_MAX: print("overflows") return None else: - return (a << 22) | (node_id << 12) | sequence_id \ No newline at end of file + return (a << 22) | (node_id << 12) | sequence_id From 8a228860b6df217964f9ffd706bf182ae9542c17 Mon Sep 17 00:00:00 2001 From: Kirill Date: Wed, 23 Sep 2026 00:58:05 +0300 Subject: [PATCH 6/6] Finished homework --- src/part1/snowflake.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/part1/snowflake.py b/src/part1/snowflake.py index 145fa740..c137f122 100644 --- a/src/part1/snowflake.py +++ b/src/part1/snowflake.py @@ -120,15 +120,15 @@ def generate_snowflake_id( cases an explanatory message is printed to stdout first. """ # TODO: реализуйте функцию - a = (time.time_ns() // 1000000) - epoch_ms 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 << 22) | (node_id << 12) | sequence_id + return (a << NODE_ID_BITS + SEQUENCE_ID_BITS) | (node_id << SEQUENCE_ID_BITS) | sequence_id