# SCRU128: Sortable, Clock and Random number-based Unique identifier
[![PyPI](https://img.shields.io/pypi/v/scru128)](https://pypi.org/project/scru128/)
[![License](https://img.shields.io/pypi/l/scru128)](https://github.com/scru128/python/blob/main/LICENSE)
SCRU128 ID is yet another attempt to supersede [UUID] for the users who need
decentralized, globally unique time-ordered identifiers. SCRU128 is inspired by
[ULID] and [KSUID] and has the following features:
- 128-bit unsigned integer type
- Sortable by generation time (as integer and as text)
- 25-digit case-insensitive textual representation (Base36)
- 48-bit millisecond Unix timestamp that ensures useful life until year 10889
- Up to 281 trillion time-ordered but unpredictable unique IDs per millisecond
- 80-bit three-layer randomness for global uniqueness
```python
import scru128
# generate a new identifier object
x = scru128.new()
print(x) # e.g., "036z951mhjikzik2gsl81gr7l"
print(int(x)) # as a 128-bit unsigned integer
# generate a textual representation directly
print(scru128.new_string()) # e.g., "036z951mhzx67t63mq9xe6q0j"
```
See [SCRU128 Specification] for details.
[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier
[ULID]: https://github.com/ulid/spec
[KSUID]: https://github.com/segmentio/ksuid
[SCRU128 Specification]: https://github.com/scru128/spec
## Command-line interface
`scru128` generates SCRU128 IDs.
```bash
$ scru128
036zg4zlmdwdz8414eim77vct
$ scru128 -n 4
036zg4zlv707wnczl108ky4i7
036zg4zlv707wnczl12towmho
036zg4zlv707wnczl14hirm6n
036zg4zlv707wnczl17110shh
```
`scru128-inspect` prints the components of given SCRU128 IDs as human- and
machine-readable JSON objects.
```bash
$ scru128 -n 2 | scru128-inspect
{
"input": "036zg552n91mt9s0gyhdwif95",
"canonical": "036zg552n91mt9s0gyhdwif95",
"timestampIso": "2022-03-20T08:34:01.493+00:00",
"timestamp": "1647765241493",
"counterHi": "10145723",
"counterLo": "13179084",
"entropy": "4167049657",
"fieldsHex": ["017fa6763e95", "9acfbb", "c918cc", "f86021b9"]
}
{
"input": "036zg552n91mt9s0gyj7i56sj",
"canonical": "036zg552n91mt9s0gyj7i56sj",
"timestampIso": "2022-03-20T08:34:01.493+00:00",
"timestamp": "1647765241493",
"counterHi": "10145723",
"counterLo": "13179085",
"entropy": "3838717859",
"fieldsHex": ["017fa6763e95", "9acfbb", "c918cd", "e4ce2fa3"]
}
```
## License
Licensed under the Apache License, Version 2.0.
Raw data
{
"_id": null,
"home_page": "https://github.com/scru128/python",
"name": "scru128",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": "identifier, uuid, guid, ulid, ksuid",
"author": "LiosK",
"author_email": "contact@mail.liosk.net",
"download_url": "https://files.pythonhosted.org/packages/81/80/e06eab1e2d0a187a71398da226d1f8bf9199719ac911eed24e2c78ef00fb/scru128-3.0.3.tar.gz",
"platform": null,
"description": "# SCRU128: Sortable, Clock and Random number-based Unique identifier\n\n[![PyPI](https://img.shields.io/pypi/v/scru128)](https://pypi.org/project/scru128/)\n[![License](https://img.shields.io/pypi/l/scru128)](https://github.com/scru128/python/blob/main/LICENSE)\n\nSCRU128 ID is yet another attempt to supersede [UUID] for the users who need\ndecentralized, globally unique time-ordered identifiers. SCRU128 is inspired by\n[ULID] and [KSUID] and has the following features:\n\n- 128-bit unsigned integer type\n- Sortable by generation time (as integer and as text)\n- 25-digit case-insensitive textual representation (Base36)\n- 48-bit millisecond Unix timestamp that ensures useful life until year 10889\n- Up to 281 trillion time-ordered but unpredictable unique IDs per millisecond\n- 80-bit three-layer randomness for global uniqueness\n\n```python\nimport scru128\n\n# generate a new identifier object\nx = scru128.new()\nprint(x) # e.g., \"036z951mhjikzik2gsl81gr7l\"\nprint(int(x)) # as a 128-bit unsigned integer\n\n# generate a textual representation directly\nprint(scru128.new_string()) # e.g., \"036z951mhzx67t63mq9xe6q0j\"\n```\n\nSee [SCRU128 Specification] for details.\n\n[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier\n[ULID]: https://github.com/ulid/spec\n[KSUID]: https://github.com/segmentio/ksuid\n[SCRU128 Specification]: https://github.com/scru128/spec\n\n## Command-line interface\n\n`scru128` generates SCRU128 IDs.\n\n```bash\n$ scru128\n036zg4zlmdwdz8414eim77vct\n$ scru128 -n 4\n036zg4zlv707wnczl108ky4i7\n036zg4zlv707wnczl12towmho\n036zg4zlv707wnczl14hirm6n\n036zg4zlv707wnczl17110shh\n```\n\n`scru128-inspect` prints the components of given SCRU128 IDs as human- and\nmachine-readable JSON objects.\n\n```bash\n$ scru128 -n 2 | scru128-inspect\n{\n \"input\": \"036zg552n91mt9s0gyhdwif95\",\n \"canonical\": \"036zg552n91mt9s0gyhdwif95\",\n \"timestampIso\": \"2022-03-20T08:34:01.493+00:00\",\n \"timestamp\": \"1647765241493\",\n \"counterHi\": \"10145723\",\n \"counterLo\": \"13179084\",\n \"entropy\": \"4167049657\",\n \"fieldsHex\": [\"017fa6763e95\", \"9acfbb\", \"c918cc\", \"f86021b9\"]\n}\n{\n \"input\": \"036zg552n91mt9s0gyj7i56sj\",\n \"canonical\": \"036zg552n91mt9s0gyj7i56sj\",\n \"timestampIso\": \"2022-03-20T08:34:01.493+00:00\",\n \"timestamp\": \"1647765241493\",\n \"counterHi\": \"10145723\",\n \"counterLo\": \"13179085\",\n \"entropy\": \"3838717859\",\n \"fieldsHex\": [\"017fa6763e95\", \"9acfbb\", \"c918cd\", \"e4ce2fa3\"]\n}\n```\n\n## License\n\nLicensed under the Apache License, Version 2.0.\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "SCRU128: Sortable, Clock and Random number-based Unique identifier",
"version": "3.0.3",
"project_urls": {
"Homepage": "https://github.com/scru128/python"
},
"split_keywords": [
"identifier",
" uuid",
" guid",
" ulid",
" ksuid"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "125c9dadaf0980c8cc7d866e27be9dbf9913ade9561a37c4a8aa07fad14b5277",
"md5": "fcfd1c55bf265e50408afed044f4f57b",
"sha256": "bb3e5117f5d39cf4fb902eb3e703bc9afddf0a49fb4baaffcc800b010262beac"
},
"downloads": -1,
"filename": "scru128-3.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fcfd1c55bf265e50408afed044f4f57b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.8",
"size": 10674,
"upload_time": "2024-03-21T13:46:15",
"upload_time_iso_8601": "2024-03-21T13:46:15.057146Z",
"url": "https://files.pythonhosted.org/packages/12/5c/9dadaf0980c8cc7d866e27be9dbf9913ade9561a37c4a8aa07fad14b5277/scru128-3.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8180e06eab1e2d0a187a71398da226d1f8bf9199719ac911eed24e2c78ef00fb",
"md5": "fc0386a0a3d2cd21292221622f92f65d",
"sha256": "90fcc7bcbb4226bc5e888d3339fd9c1b0603424b3534b5b710beef507c0df9c5"
},
"downloads": -1,
"filename": "scru128-3.0.3.tar.gz",
"has_sig": false,
"md5_digest": "fc0386a0a3d2cd21292221622f92f65d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 9561,
"upload_time": "2024-03-21T13:46:17",
"upload_time_iso_8601": "2024-03-21T13:46:17.081897Z",
"url": "https://files.pythonhosted.org/packages/81/80/e06eab1e2d0a187a71398da226d1f8bf9199719ac911eed24e2c78ef00fb/scru128-3.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-21 13:46:17",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "scru128",
"github_project": "python",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "scru128"
}