{"id":15893839,"url":"https://github.com/chinanf-boy/nanoid-explain","last_synced_at":"2025-04-02T18:16:16.461Z","repository":{"id":90548475,"uuid":"120467698","full_name":"chinanf-boy/nanoid-explain","owner":"chinanf-boy","description":"explain : nanoid secure, URL-friendly, unique string ID generator 随机id生成器小就是好😊","archived":false,"fork":false,"pushed_at":"2018-02-06T14:14:43.000Z","size":3,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-08T08:47:13.730Z","etag":null,"topics":["explain","nanoid"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chinanf-boy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-02-06T14:14:21.000Z","updated_at":"2018-02-06T14:17:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"e4e4cefc-b4e0-4deb-880e-b316f9fa61f9","html_url":"https://github.com/chinanf-boy/nanoid-explain","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fnanoid-explain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fnanoid-explain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fnanoid-explain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fnanoid-explain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinanf-boy","download_url":"https://codeload.github.com/chinanf-boy/nanoid-explain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246866100,"owners_count":20846496,"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":["explain","nanoid"],"created_at":"2024-10-06T08:13:51.987Z","updated_at":"2025-04-02T18:16:16.439Z","avatar_url":"https://github.com/chinanf-boy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nanoid\n\n用于JavaScript的小型（176字节），安全的，URL友好的，唯一的字符串ID生成器。\n\n[![explain](http://llever.com/explain.svg)](https://github.com/chinanf-boy/Source-Explain)\n    \nExplanation\n\n\u003e \"version\": \"1.0.0\"\n\n[github source](https://github.com/ai/nanoid)\n\n~~[english](./README.en.md)~~\n\n---\n\n[网上玩弄-nanoid 找出id复杂度](https://github.com/Alex7Kom/nano-nanoid-cc)\n\n---\n\n## 目录\n\n- [使用与尝试](#使用与尝试)\n\n- [index.js 默认导出](#index)\n\n- [random \u003e node内置生成加密强伪随机数据](#random)\n\n- [random-browser \u003e 浏览器版本的生成加密强伪随机数据](#random-browser)\n\n- [generate \u003e 自己定义-规定字符-与长度](#generate)\n\n- [format \u003e 改变底层random函数 和 自己定义-规定字符-与长度](#format)\n\n---\n\n## 使用与尝试\n\n``` js\nvar nanoid = require('nanoid')\nmodel.id = nanoid() //=\u003e \"Uakgb_J5m9g~0JDMbcJqLJ\"\n```\n\n| 试试👌 - ·yarn· ·npm·\n\n[`node try-nanoid.js`](./try-nanoid.js)\n\n## index\n\n代码 1-3\n\n``` js\nvar random = require('./random')\nvar url = '_~0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n```\n\n代码 21-29\n\n``` js\nmodule.exports = function (size) { // == nanoid()\n  size = size || 21 // 默认 21位\n  var id = ''\n  var bytes = random(size) // \n  while (0 \u003c size--) { // 逐个随机\n    id += url[bytes[size] \u0026 63] //  从 url 数组中选择\n  }\n  return id\n}\n```\n\n- \u0026 \n\n``` js\n1 \u0026 63\n// 1\n100 \u0026 63\n// 36\n```\n\n- [random(size)](#random)\n\n\u003e 生成加密强伪随机数据. size参数是指示要生成的字节数的数值。\n\n\n## random\n\n``` js\nmodule.exports = require('crypto').randomBytes // 引用\n```\n\n| 详细文档🔎\n\n`crypto.randomBytes(size[, callback]) \u003e\u003e `[nodejs.cn文档](http://nodejs.cn/api/crypto.html#crypto_crypto_randombytes_size_callback)\n\n| 试试👌\n\n[`node try-crypto.js`](./try-crypto.js)\n\n| 简要说明📖\n\n1. 如果提供 `callback` 回调函数,是`异步`生成的并且使用两个参数调用`callback`函数：`err`和`buf`\n\n``` js\n// Asynchronous\nconst crypto = require('crypto');\ncrypto.randomBytes(256, (err, buf) =\u003e {\n  if (err) throw err;\n  console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);\n});\n```\n\n2. 如果未提供 callback回调函数, 则`同步`地生成随机字节并返回为Buffer。\n \n``` js\n// Synchronous \nconst buf = crypto.randomBytes(256);\nconsole.log(\n  `${buf.length} bytes of random data: ${buf.toString('hex')}`);\n```\n\n---\n\n|\n\n当然nanoid 不仅可以用于`node`，还有`browser`\n\n这就需要，browser \u003c- `random-browser.js` 替换 node \u003c- `const crypto = require('crypto');`\n\n|\n\n---\n\n## random-browser\n\n浏览器版本的-random\n\n``` js\nvar crypto = window.crypto || window.msCrypto\n\nmodule.exports = function (bytes) {\n  return crypto.getRandomValues(new Uint8Array(bytes))\n}\n\n```\n\n可以从 -package.json- 看出端疑 \n\n``` json\n  \"browser\": {\n    \"./random.js\": \"./random-browser.js\" // 重导向\n  },\n```\n\n---\n\n## generate\n\ngenerate.js\n\n``` js\nvar random = require('./random')\nvar format = require('./format')\n```\n\n``` js\nmodule.exports = function (alphabet, size) {\n    // 底层random, 自己定义的 \n    // alphabet 字符集\n    // size id 长度\n  return format(random, alphabet, size) // 看来主角是-format\n}\n\n```\n\n\n\n---\n\n起示例-来看看 `format`\n\n``` js\nvar format = require('nanoid/format')\n\nfunction random (size) {\n  var result = []\n  for (var i = 0; i \u003c size; i++) result.push(randomByte())\n  // randomByte() ??? 需要自己编写\n  return result\n}\n\nformat(random, \"abcdef\", 10) \n```\n\n## format\n\nformat.js 可以改变底层-\u003e关于[`random`函数](#random)定义\n\n\n``` js\nmodule.exports = function (random, alphabet, size) {\n  var mask = (2 \u003c\u003c Math.log(alphabet.length - 1) / Math.LN2) - 1 // mask==7  alphabet == \"abcdef\"\n  var step = Math.ceil(1.6 * mask * size / alphabet.length)\n // step == 19  size == 10\n  var id = ''\n  while (true) {    // 随机到的字符 不一定在范围:alphabet 内\n  // 循环♻️\n    var bytes = random(step) // 启动自己编写的随机函数 或者 原生\n    for (var i = 0; i \u003c step; i++) {\n      var byte = bytes[i] \u0026 mask // 控制占位\n      if (alphabet[byte]) { // 是否在规定的字符范围\n        id += alphabet[byte] // 加入\n        if (id.length === size) return id // 到底限定-长度\n        // 返回，退出循环♻️\n      }\n    }\n  }\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fnanoid-explain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinanf-boy%2Fnanoid-explain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fnanoid-explain/lists"}