armour_core/key_part.rs
1use core::num::NonZeroU64;
2
3use crate::key_type::KeyType;
4
5/// group_id calc
6///
7/// 24 bits prefix for id in big endian
8///
9/// each group is 256 elements for ID
10pub const SEQ_BITS: u32 = 24;
11
12/// group_id calc
13///
14/// 16 bits prefix for id in big endian
15///
16/// each group is 65536 elements for ID
17pub const SEQ64_BITS: u32 = 16;
18
19// 30 bit timestamp in ms represent 12 days
20// другими словами, первые 10 бит - уникальные для группы. Одна группа будет содержать идентификаторы, созданные в окне из 12 дней. В году будет 31 группа.
21// +- 1 bit = 12 days * 2
22// 30 bit = 1_073_741_824 ms = 12 days
23// 40 - 30 = 10 bit = 1024
24// groups represent 32 bit numbers, поэтому:
25// 32 - 10 = 22, 2^22 = 4_194_304 = 0x40_0000
26pub const MILLISECOND_BITS: u32 = 10;
27
28pub trait KeyPart: Sized {
29 const TY: KeyType;
30 const PREFIX_BITS: u32;
31}
32
33impl KeyPart for NonZeroU64 {
34 const TY: KeyType = KeyType::U64;
35 const PREFIX_BITS: u32 = SEQ64_BITS;
36}