Skip to content

Commit d31ccf4

Browse files
committed
Fix byte-order in uuid1 and uuid6
1 parent c935c35 commit d31ccf4

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

src/lib.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::{
1212
hash::{Hash, Hasher},
1313
ptr::null_mut,
1414
sync::atomic::{AtomicPtr, AtomicU64, Ordering},
15+
time::SystemTime,
1516
};
1617
use uuid::{Builder, Bytes, Context, Timestamp, Uuid, Variant, Version};
1718

@@ -305,13 +306,17 @@ impl UUID {
305306
#[pyo3(signature = (node=None, clock_seq=None))]
306307
fn uuid1(node: Option<u64>, clock_seq: Option<u64>) -> PyResult<UUID> {
307308
let node = match node {
308-
Some(node) => node.to_ne_bytes(),
309-
None => _getnode().to_ne_bytes(),
309+
Some(node) => node.to_be_bytes(),
310+
None => _getnode().to_be_bytes(),
310311
};
311-
let node = &[node[0], node[1], node[2], node[3], node[4], node[5]];
312+
let node: &[u8; 6] = node[2..8].try_into().unwrap();
312313
let uuid = match clock_seq {
313314
Some(clock_seq) => {
314-
let ts = Timestamp::from_unix(&Context::new_random(), clock_seq, 0);
315+
let dur = SystemTime::now()
316+
.duration_since(SystemTime::UNIX_EPOCH)
317+
.unwrap();
318+
let ts =
319+
Timestamp::from_unix_time(dur.as_secs(), dur.subsec_nanos(), clock_seq as u128, 14);
315320
Uuid::new_v1(ts, node)
316321
}
317322
None => Uuid::now_v1(node),
@@ -354,17 +359,16 @@ fn uuid5(namespace: &UUID, name: StringOrBytes) -> PyResult<UUID> {
354359
#[pyo3(signature = (node=None, timestamp=None, nanos=None))]
355360
fn uuid6(node: Option<u64>, timestamp: Option<u64>, nanos: Option<u32>) -> PyResult<UUID> {
356361
let node = match node {
357-
Some(node) => node.to_ne_bytes(),
358-
None => _getnode().to_ne_bytes(),
362+
Some(node) => node.to_be_bytes(),
363+
None => _getnode().to_be_bytes(),
359364
};
360-
let node = &[node[0], node[1], node[2], node[3], node[4], node[5]];
365+
let node: &[u8; 6] = node[2..8].try_into().unwrap();
361366

362367
let uuid = match timestamp {
363368
Some(timestamp) => {
364-
let timestamp =
365-
Timestamp::from_unix(&Context::new_random(), timestamp, nanos.unwrap_or(0));
369+
let ts = Timestamp::from_unix(&Context::new_random(), timestamp, nanos.unwrap_or(0));
366370
return Ok(UUID {
367-
uuid: Uuid::new_v6(timestamp, node),
371+
uuid: Uuid::new_v6(ts, node),
368372
});
369373
}
370374
None => Uuid::now_v6(node),

tests/test_uuid.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ def test_uuid1() -> None:
7070
uuid = uuid_utils.uuid1()
7171
assert isinstance(uuid, uuid_utils.UUID)
7272

73-
uuid = uuid_utils.uuid1(node=8155362240700, clock_seq=123)
73+
uuid = uuid_utils.uuid1(node=getnode(), clock_seq=123)
7474
assert isinstance(uuid, uuid_utils.UUID)
75+
assert uuid.node == getnode()
76+
assert uuid.clock_seq == 123
7577

7678

7779
@pytest.mark.parametrize("name", ["python.org", b"python.org"])
@@ -94,9 +96,11 @@ def test_uuid5(name: str) -> None:
9496
def test_uuid6() -> None:
9597
uuid = uuid_utils.uuid6(getnode(), 1679665408)
9698
assert isinstance(uuid, uuid_utils.UUID)
99+
assert uuid.node == getnode()
97100

98101
uuid = uuid_utils.uuid6(getnode(), 1679665408, 123)
99102
assert isinstance(uuid, uuid_utils.UUID)
103+
assert uuid.node == getnode()
100104

101105
uuid = uuid_utils.uuid6()
102106
assert isinstance(uuid, uuid_utils.UUID)
@@ -150,6 +154,8 @@ def test_uuid_version(version: int) -> None:
150154
def test_uuid_illegal_version() -> None:
151155
with pytest.raises(ValueError):
152156
uuid_utils.UUID("a8098c1a-f86e-11da-bd1a-00112444be1e", version=0)
157+
158+
with pytest.raises(ValueError):
153159
uuid_utils.UUID("a8098c1a-f86e-11da-bd1a-00112444be1e", version=9)
154160

155161

0 commit comments

Comments
 (0)