Title: [RFE] `fields` and `time_*` properties must not be used on UUIDs that are time-agnostic. · Issue #120878 · python/cpython · GitHub
Open Graph Title: [RFE] `fields` and `time_*` properties must not be used on UUIDs that are time-agnostic. · Issue #120878 · python/cpython
X Title: [RFE] `fields` and `time_*` properties must not be used on UUIDs that are time-agnostic. · Issue #120878 · python/cpython
Description: Currently, the uuid.UUID class features a fields argument and property which is a six-tuple of integers: 32-bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit clock_seq_low, and 48-bit node. Currentl...
Open Graph Description: Currently, the uuid.UUID class features a fields argument and property which is a six-tuple of integers: 32-bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit ...
X Description: Currently, the uuid.UUID class features a fields argument and property which is a six-tuple of integers: 32-bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit ...
Opengraph URL: https://github.com/python/cpython/issues/120878
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[RFE] `fields` and `time_*` properties must not be used on UUIDs that are time-agnostic.","articleBody":"Currently, the `uuid.UUID` class features a `fields` argument and property which is a six-tuple of integers:\r\n\r\n- 32-bit `time_low`,\r\n- 16-bit `time_mid`,\r\n- 16-bit `time_hi_version`,\r\n- 8-bit `clock_seq_hi_variant`,\r\n- 8-bit `clock_seq_low`, \r\n- and 48-bit `node`.\r\n\r\nCurrently, those fields are only relevant when the UUID version is 1 since UUIDv3 and UUIDv5 are based on MD5 and SHA-1 respectively instead. However, the recent RFC 9562, superseeding RFC 4122, introduces one time-based UUID, namely UUIDv6 (basde on UNIX epoch instead of Gregorian epoch, and with timestamp bits ordered differently), as well as UUIDv7 and UUIDv8 that are implementation details.\r\n\r\nHere is what we can do for now:\r\n\r\n- For version 7, we can have:\r\n - a cryptographically secure 74-bit chunk split into a 12 and 62-bit chunks, or\r\n - a monotonous UUID with 12-bit sub-milliseconds precision chunk.\r\n- For version 8, we can have:\r\n - a [time-based UUID with 10-ns precision](https://www.rfc-editor.org/rfc/rfc9562#name-example-of-a-uuidv8-value-t) with a 60-bit timestamp and 62 bits of random data, or\r\n - a [name-based UUID](https://www.rfc-editor.org/rfc/rfc9562#name-example-of-a-uuidv8-value-n) which uses secure hashing algorithms such as SHA256/SHA-3/SHAKE-256 (see [here](https://www.rfc-editor.org/rfc/rfc9562#v8sha256) for an example of SHA256-based UUIDv8), or\r\n - a *non*-cryptographically 122-bit chunk split into chunks of 48, 12 and 62-bit independent chunks. Those chunks can also be supplied by the user if they want cryptographically secure values (although I would suggest generating a UUIDv4 and change the version and variant bits manually).\r\n\r\nWith the addition of those variants, we at least have one UUID distinct from UUIDv1 featuring time-related fields. In particular, it is important to decide whether `fields[0]` is the first RFC field in the UUID *or* if this is always the first 32-bit fields. I personally think that we should say that *fields* represents the RFC fields, namely, `fields[0]` is a 32-bit integer corresponding to the 32 **LSB** (resp. **MSB**) of the 60-bit timestamp for UUIDv1 (resp. UUIDv6).\r\n\r\nFor UUIDv7, if we choose sub-ms precision, then the fields are a bit different in the sense that we now have `unix_ts_ms (48) | ver (4) | subsec_a (12) | var (2) | counter (62)`, so we should decide how to split those fields into 6 and whether it make sense to have the corresponding properties. A similar question arises for UUIDv8.\r\n\r\nWhile we could change the semantics of the fields and `time_*` properties, this could break applications that assume that `fields` are independent of the time (my understanding of *fields* is that it is independent of the time or the RFC and is only a way to partition the UUID's integral value into *32+16+16+8+8+48* bits, but such partitioning is only relevant for UUIDv1). \r\n\r\nTherefore, I really don't know how to deal with those time-based properties. I'd like to avoid breaking longstanding applications but at the same time I don't want a property to incorrectly reflect its value. If we don't change anything, `uuidv6.time_low` would actually return the 32 highest bits...\r\n\r\nEDIT: Should this actually be a PEP? because UUIDv7 and UUIDv8 are implementation-detail so maybe a PEP might be a good idea?\r\n\r\n---\r\n\r\n* #89083 \r\n* #120650\r\n* #121119\r\n","author":{"url":"https://github.com/picnixz","@type":"Person","name":"picnixz"},"datePublished":"2024-06-22T12:10:42.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/120878/cpython/issues/120878"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5fbcdd31-f2ec-3edf-eac9-640dc50f1eba |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DBAC:327857:166FFAC:1EDB354:696A9B34 |
| html-safe-nonce | d58259c847b4d0ed295c9c1fed1a6aed23d03c739c312c279c34ae4c03741766 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQkFDOjMyNzg1NzoxNjZGRkFDOjFFREIzNTQ6Njk2QTlCMzQiLCJ2aXNpdG9yX2lkIjoiNTM1OTc1MjEzNDk3NjUxMDc3MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1eb42c8d86c4558a1f0f5efd1c4428ab8e8ffd7ce828473caa0d2065ec221c8d |
| hovercard-subject-tag | issue:2367784602 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/120878/issue_layout |
| twitter:image | https://opengraph.githubassets.com/8ac3c6f78c4b88219c221eb97deb5db6678eef98b94679ea8a690243e1109076/python/cpython/issues/120878 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/8ac3c6f78c4b88219c221eb97deb5db6678eef98b94679ea8a690243e1109076/python/cpython/issues/120878 |
| og:image:alt | Currently, the uuid.UUID class features a fields argument and property which is a six-tuple of integers: 32-bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | picnixz |
| hostname | github.com |
| expected-hostname | github.com |
| None | c0d8175e41e0e55b9e984c935b24b808cabab919dd3174aa45dac3ef503ed1af |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 99aab454e5ddc8df30805fb76c114c3008a15842 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width