{"id":24811646,"url":"https://github.com/zelark/nano-id","last_synced_at":"2025-04-04T09:09:21.076Z","repository":{"id":46863923,"uuid":"138770126","full_name":"zelark/nano-id","owner":"zelark","description":"A unique string ID generator for Clojure and ClojureScript (・_・)ノ","archived":false,"fork":false,"pushed_at":"2024-01-26T13:42:59.000Z","size":68,"stargazers_count":184,"open_issues_count":1,"forks_count":9,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-04-26T13:46:49.829Z","etag":null,"topics":["clojure","clojurescript","id-generator","secure-random-generator"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zelark.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-26T17:20:50.000Z","updated_at":"2024-06-19T01:30:47.598Z","dependencies_parsed_at":"2024-06-19T01:30:46.301Z","dependency_job_id":"b805f7f4-66e0-44d3-bcc8-d8e6399a14fc","html_url":"https://github.com/zelark/nano-id","commit_stats":{"total_commits":74,"total_committers":4,"mean_commits":18.5,"dds":0.04054054054054057,"last_synced_commit":"96a26c51d3b5191d99277ae2b599942a1fc69474"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zelark%2Fnano-id","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zelark%2Fnano-id/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zelark%2Fnano-id/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zelark%2Fnano-id/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zelark","download_url":"https://codeload.github.com/zelark/nano-id/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247149501,"owners_count":20891954,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clojure","clojurescript","id-generator","secure-random-generator"],"created_at":"2025-01-30T13:15:40.047Z","updated_at":"2025-04-04T09:09:21.054Z","avatar_url":"https://github.com/zelark.png","language":"Clojure","funding_links":[],"categories":["分布式开发"],"sub_categories":["Spring Cloud框架"],"readme":"# nano-id\n\nA tiny, secure, URL-friendly unique string ID generator for Clojure and ClojureScript.\n\n- **Secure**. It uses cryptographically strong random APIs.\n- **Compact**. It uses a larger alphabet than UUID (A-Za-z0-9_-). So ID size was reduced from 36 to 21 symbols.\n- **URL-Friendly**. It uses only URL-friendly characters. Perfect for unique identifiers in web applications.\n\n```clojure\nclj -Sdeps '{:deps {nano-id/nano-id {:mvn/version \"1.1.0\"}}}'\n\n(require '[nano-id.core :refer [nano-id]])\n(nano-id) ;; =\u003e \"trxwfoC8mqB3Q8Wrdq4OQ\"\n```\n\n[![Clojars Project](https://img.shields.io/clojars/v/nano-id.svg)](https://clojars.org/nano-id)\n[![cljdoc badge](https://cljdoc.org/badge/nano-id/nano-id)](https://cljdoc.org/d/nano-id/nano-id/CURRENT)\n[![clojure tests](https://github.com/zelark/nano-id/actions/workflows/tests.yaml/badge.svg?branch=master)](https://github.com/zelark/nano-id/actions/workflows/tests.yaml)\n\n## Benchmark\n\n```bash\n$ lein bench\n\n## Actually, you will get more detailed info, this is summary of 3 runs.\n\nUUID               0.29µs 0.29µs 0.30µs\nnano-id            0.43µs 0.44µs 0.43µs\njnanoid            0.64µs 0.66µs 0.65µs\nnano-id (custom)   0.62µs 0.62µs 0.62µs\njnanoid (custom)   0.65µs 0.65µs 0.68µs\n```\n\nConfiguration:\n\n- MacBook Pro (16-inch, 2019), 2,3 GHz 8-Core Intel Core i9, 32 GB 2667 MHz DDR4;\n- OpenJDK Runtime Environment Temurin-11.0.22+7 (build 11.0.22+7);\n- Clojure 1.11.1.\n\n## Installation\n\n### Clojure CLI\n\n```text\nnano-id/nano-id {:mvn/version \"1.1.0\"}\n```\n\n### Leiningen or Boot\n\n```text\n[nano-id \"1.1.0\"]\n```\n\n## Usage\n\nThe default implementation uses 64-character alphabet and generates 21-character IDs.\n\n```clojure\nuser=\u003e (require '[nano-id.core :refer [nano-id]])\nnil\n\nuser=\u003e (nano-id)\n\"NOBHihn110UuXbF2JiKxT\"\n```\n\nIf you want to reduce the ID size (and increase collision probability), you can pass the size as an argument.\n\n```clojure\nuser=\u003e (nano-id 10)\n\"N2g6IlJP0l\"\n```\n\nDon’t forget to check the safety of your ID size via [collision probability calculator](https://zelark.github.io/nano-id-cc/).\n\n### IE\n\nFor IE support, you need to add crypto alias:\n\n```clojure\n(ns your-app.polyfills)\n\n(when-not (exists? js/crypto)\n  (set! js/crypto js/msCrypto))\n```\n\n```clojure\n(ns your-app.core\n  (:require [your-app.polyfills]\n            [nano-id.core :refer [nano-id]]))\n```\n\n### Node.js\n\nIf your target is node, use `@peculiar/webcrypto` polyfill:\n\n```clojure\n(ns your-app.polyfills\n  (:require [\"@peculiar/webcrypto\" :refer [Crypto]]))\n\n(set! js/crypto (Crypto.))\n```\n\n```clojure\n(ns your-app.core\n  (:require [your-app.polyfills]\n            [nano-id.core :refer [nano-id]]))\n```\n\n### Custom ID generator\n\nIf for whatever reason the default implementation doesn't fit your project, you can build your own ID generator just passing your alphabet and ID size in `custom` function. It will give you back a new generator:\n\n```clojure\nuser=\u003e (require '[nano-id.core :refer [custom]])\nnil\n\nuser=\u003e (def my-nano-id (custom \".-\" 6))\n#'user/my-nano-id\n\nuser=\u003e (my-nano-id)\n\"-.---.\"\n```\n\nAlso you can provide your random bytes generator. In the example below we use this feature to encode the current time:\n\n```clojure\n(let [alphabet \"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\"\n      time-gen (fn [n]\n                 (-\u003e\u003e (quot (System/currentTimeMillis) 1000)\n                      (iterate #(unsigned-bit-shift-right % 6))\n                      (take n)\n                      reverse\n                      byte-array))\n      time-id  (custom alphabet 6 time-gen)]\n  (time-id))\n\"0TfMui\"\n```\n\nThis encodes current time using a lexicographical alphabet.\n\n## Tools\n\n- [Nano ID Collision Calculator](https://zelark.github.io/nano-id-cc/)\n\n## Other implementations\n\nYou can find implementations in other programming languages [here](https://github.com/ai/nanoid#other-programming-languages).\n\n## Inspired by\n\n[Nano ID](https://github.com/ai/nanoid).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzelark%2Fnano-id","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzelark%2Fnano-id","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzelark%2Fnano-id/lists"}