{"id":13394416,"url":"https://github.com/ai/nanoid","last_synced_at":"2025-05-12T14:56:11.594Z","repository":{"id":37270503,"uuid":"99401299","full_name":"ai/nanoid","owner":"ai","description":"A tiny (124 bytes), secure, URL-friendly, unique string ID generator for JavaScript","archived":false,"fork":false,"pushed_at":"2025-04-30T19:37:30.000Z","size":5232,"stargazers_count":25540,"open_issues_count":3,"forks_count":821,"subscribers_count":157,"default_branch":"main","last_synced_at":"2025-05-05T13:56:14.880Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://zelark.github.io/nano-id-cc/","language":"JavaScript","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/ai.png","metadata":{"files":{"readme":"README.id-ID.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"tidelift":"npm/nanoid","github":"ai"}},"created_at":"2017-08-05T05:24:35.000Z","updated_at":"2025-05-05T12:43:51.000Z","dependencies_parsed_at":"2023-02-19T06:31:13.856Z","dependency_job_id":"c06371a9-1bb9-46d9-b255-112be033adbe","html_url":"https://github.com/ai/nanoid","commit_stats":{"total_commits":1065,"total_committers":139,"mean_commits":7.661870503597123,"dds":"0.18967136150234742","last_synced_commit":"6f5b50737bc9cf942f69a53df64bf3fbdf7e2482"},"previous_names":[],"tags_count":111,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ai%2Fnanoid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ai%2Fnanoid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ai%2Fnanoid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ai%2Fnanoid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ai","download_url":"https://codeload.github.com/ai/nanoid/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253759872,"owners_count":21959835,"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":[],"created_at":"2024-07-30T17:01:18.611Z","updated_at":"2025-05-12T14:56:11.572Z","avatar_url":"https://github.com/ai.png","language":"JavaScript","readme":"# Nano ID\n\n\u003cimg src=\"https://ai.github.io/nanoid/logo.svg\" align=\"right\"\n     alt=\"Logo Nano ID oleh Anton Lovchikov\" width=\"180\" height=\"94\"\u003e\n\n[English](./README.md) | [日本語](./README.ja.md) | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | **Bahasa Indonesia** | [한국어](./README.ko.md)\n\nSebuah generator ID yang unik dalam bentuk string yang ringan, aman, serta _URL-friendly_ untuk JavaScript.\n\n\u003e \"Sebuah tingkat kesempurnaan yang luar biasa,\n\u003e yang mana tidak mungkin untuk tidak dihormati.\"\n\n- **Ringan.** Hanya 118 bytes (diperkecil dan brotlied). Tidak ada ketergantungan (dependencies) apapun. [Size Limit](https://github.com/ai/size-limit) mengatur ukuran dari generator ini.\n- **Aman.** Nano ID menggunakan RNG yang terdapat pada perangkat keras. Dapat digunakan dalam lingkungan seperti klaster.\n- **ID yang pendek.** Nano ID menggunakan alfabet yang lebih banyak ketimbang UUID (`A-Za-z0-9_-`), karenanya ukuran ID menjadi berkurang dari 36 menjadi 21 simbol.\n- **Portabel.** Nano ID telah dimigrasi untuk [20 bahasa pemrograman lainnya](#bahasa-pemrograman-lainnya).\n\n```js\nimport { nanoid } from 'nanoid'\nmodel.id = nanoid() //=\u003e \"V1StGXR8_Z5jdHi6B-myT\"\n```\n\nMendukung penjelajah (browser) modern, IE [dengan Babel](https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/), Node.js, dan React Native.\n\n---\n\n\u003cimg src=\"https://cdn.evilmartians.com/badges/logo-no-label.svg\" alt=\"\" width=\"22\" height=\"16\" /\u003e  Made at \u003cb\u003e\u003ca href=\"https://evilmartians.com/devtools?utm_source=nanoid\u0026utm_campaign=devtools-button\u0026utm_medium=github\"\u003eEvil Martians\u003c/a\u003e\u003c/b\u003e, product consulting for \u003cb\u003edeveloper tools\u003c/b\u003e.\n\n---\n\n\n## Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [Perbandingan dengan UUID](#perbandingan-dengan-uuid)\n- [Benchmark](#benchmark)\n- [Keamanan](#keamanan)\n- [Instalasi](#instalasi)\n- [API](#api)\n  - [Blocking](#blocking)\n  - [Non-Secure](#non-secure)\n  - [Alfabet dan Ukuran (Custom)](#alfabet-dan-ukuran-custom)\n  - [Generasi Random Bytes (Custom)](#generasi-random-bytes-custom)\n- [Penggunaan](#penggunaan)\n  - [React](#react)\n  - [React Native](#react-native)\n  - [PouchDB dan CouchDB](#pouchdb-dan-couchdb)\n  - [CLI](#cli)\n  - [TypeScript](#typescript)\n  - [Bahasa Pemrograman Lainnya](#bahasa-pemrograman-lainnya)\n- [Alat](#alat)\n\n\n## Perbandingan dengan UUID\n\nNano ID dapat dibandingkan dengan UUID v4 (yang berbasis acak / _randomly generated_). Nano ID dan UUID v4 memiliki jumlah bita yang mirip pada ID yang dihasilkan (126 bita pada NanoID dan 122 bita pada UUID), karenanya ia memiliki probabilitas _collision_ (konflik / tabrakan) yang hampir serupa:\n\n\u003e Agar timbul kemungkinan collison / duplikasi ID satu dalam satu miliar, perlu dihasilkan 103 triliun UUID v4.\n\nAda dua buah perbedaan antara Nano ID dan UUID v4:\n\n1. Nano ID menggunakan alfabet yang lebih lebar, karenanya jumlah bita acak dapat 'dikemas' dalam 21 simbol, bukan 36 simbol.\n2. Kode sumber Nano ID **empat kali lebih kecil** ketimbang `uuid/v4`: 130 bytes dibanding 423 bytes.\n\n\n## Benchmark\n\n```rust\n$ node ./test/benchmark.js\ncrypto.randomUUID          7,619,041 ops/sec\nuuid v4                    7,436,626 ops/sec\n@napi-rs/uuid              4,730,614 ops/sec\nuid/secure                 4,729,185 ops/sec\n@lukeed/uuid               4,015,673 ops/sec\nnanoid                     3,693,964 ops/sec\ncustomAlphabet             2,799,255 ops/sec\nnanoid for browser           380,915 ops/sec\nsecure-random-string         362,316 ops/sec\nuid-safe.sync                354,234 ops/sec\nshortid                       38,808 ops/sec\n\nNon-secure:\nuid                       11,872,105 ops/sec\nnanoid/non-secure          2,226,483 ops/sec\nrndm                       2,308,044 ops/sec\n```\n\nKonfigurasi pengujian: Framework 13 7840U, Fedora 39, Node.js 21.6.\n\n\n## Keamanan\n\n_Lihat artikel yang informatif tentang teori angka acak: [Nilai acak yang aman dalam Node.js (English)](https://gist.github.com/joepie91/7105003c3b26e65efcea63f3db82dfba)_.\n\n- **Ketidakpastian.** Sebagai ganti untuk penggunaan `Math.random()`, Nano ID menggunakan modul `crypto` yang ada di dalam Nodejs dan/atau Web Crypto API dalam penjelajah (_browser_). Modul-modul ini menggunakan generator acak berbasis perangkat keras yang tidak bisa diprediksi untuk mendapatkan nilai-nilai yang tidak pasti yang aman secara kriptografis.\n\n- **Keseragaman.** Pembagian dengan rumus `random % alphabet` adalah kesalahan yang seringkali dilakukan ketika merancang sebuah generator ID. Distribusi dari nilai-nilai tersebut tidak akan seimbang; dalam artian ada kesempatan untuk beberapa simbol untuk muncul dibandingkan dengan simbol yang lain. Ini memiliki dampak yang kurang baik, yakni mengurangi jumlah percobaan ketika seseorang mencoba untuk melakukan _brute-force attacks_. Nano ID menggunakan [algoritma yang lebih baik](https://github.com/ai/nanoid/blob/main/index.js) dan sudah diuji untuk keseragamannya.\n\n  \u003cimg src=\"img/distribution.png\" alt=\"Nano ID uniformity\"\n    width=\"340\" height=\"135\"\u003e\n\n- **Terdokumentasi secara baik.** Seluruh algoritma Nano ID sudah terdokumentasi. Lihat komentar di [kode sumber](https://github.com/ai/nanoid/blob/main/index.js).\n\n- **Kerentanan.** Untuk melaporkan sebuah _security vulnerability_ atau kerentanan, mohon menggunakan [Tidelift Security Contact](https://tidelift.com/security). Tidelift akan mengkoordinasikan pembetulan dan penyingkapan dari kerentanan tersebut.\n\n\n## Instalasi\n\n```bash\nnpm install nanoid\n```\n\nNano ID 5 hanya tersedia untuk proyek, pengujian, atau skrip ESM Node.js.\nUntuk CommonJS Anda memerlukan Nano ID 3.x (kami masih mendukungnya):\n\n```bash\nnpm install nanoid@3\n```\n\nApabila ingin 'coba-coba' terlebih dahulu, dapat digunakan Nano ID melalui CDN. Hal ini tidak direkomendasikan untuk digunakan pada lingkungan produksi karena performa pemuatan (_loading_) yang berkurang.\n\n```js\nimport { nanoid } from 'https://cdn.jsdelivr.net/npm/nanoid/nanoid.js'\n```\n\n\n## API\n\nNano ID memiliki dua API: normal dan _non-secure_.\n\nBawaannya, Nano ID menggunakan simbol yang _URL-friendly_ (`A-Za-z0-9_-`) dan mengembalikan ID dengan 21 karakter (untuk memiliki probabilitas collision / tabrakan yang mirip dengan UUID v4).\n\n\n### Blocking\n\nPenggunaan Nano ID yang aman dan yang paling mudah.\n\nDalam kasus langka, fungsi ini dapat menghambat CPU untuk melakukan proses yang lain ketika dalam proses 'noise-collection' untuk generasi nilai acak (yang dilakukan pada perangkat keras).\n\n```js\nimport { nanoid } from 'nanoid'\nmodel.id = nanoid() //=\u003e \"V1StGXR8_Z5jdHi6B-myT\"\n```\n\nApabila ingin mengurangi ukuran ID (dan meningkatkan probabilitas collision), dapat dimasukkan `size` sebagai argumen dari fungsi `nanoid()`.\n\n```js\nnanoid(10) //=\u003e \"IRFa-VaY2b\"\n```\n\nJangan lupa memeriksa tingkat keamanan dari ukuran ID dalam situs [ID collision probability calculator](https://zelark.github.io/nano-id-cc/).\n\nDapat digunakan pula [custom alphabet](#custom-alphabet-or-size) atau [random generator](#custom-random-bytes-generator) yang lain.\n\n\n### Non-Secure\n\nKonfigurasi bawaan Nano ID menggunakan random bytes generator yang berasal dari perangkat keras untuk keamanan dan probabilitas collision yang rendah. Apabila tidak terlalu memikirkan soal keamanan, dapat pula menggunakan non-secure generator yang lebih cepat.\n\n```js\nimport { nanoid } from 'nanoid/non-secure'\nconst id = nanoid() //=\u003e \"Uakgb_J5m9g-0JDMbcJqLJ\"\n```\n\n\n### Alfabet dan Ukuran (Custom)\n\n`customAlphabet` digunakan untuk membuat Nano ID dengan alfabet dan ukuran ID yang sesuai dengan kebutuhan (dapat dikustomisasi).\n\n```js\nimport { customAlphabet } from 'nanoid'\nconst nanoid = customAlphabet('1234567890abcdef', 10)\nmodel.id = nanoid() //=\u003e \"4f90d13a42\"\n```\n\nKetika menggunakan fungsi ini, jangan lupa untuk memeriksa keamanan alfabet dan ukuran ID dalam [ID collision probability calculator](https://alex7kom.github.io/nano-nanoid-cc/). Untuk lebih banyak alfabet, dapat menggunakan [`nanoid-dictionary`](https://github.com/CyberAP/nanoid-dictionary).\n\nAlfabet harus terbentuk dari 256 simbol atau lebih kecil. Selain itu, keamanan algoritma generasi yang berada di dalam library ini tidak dijamin aman.\n\nAPI non-secure yang dapat dikustomisasi dengan `customAlphabet` pun tersedia disini:\n\n```js\nimport { customAlphabet } from 'nanoid/non-secure'\nconst nanoid = customAlphabet('1234567890abcdef', 10)\nuser.id = nanoid()\n```\n\n\n### Generasi Random Bytes (Custom)\n\n`customRandom` digunakan untuk membuat Nano ID yang mengganti alfabet dan algoritma _random bytes generator_ yang telah diimplementasikan pada versi bawaan (dalam artian menggunakan algoritma sendiri untuk mendapatkan random bytes).\n\nPada contoh berikut, digunakan _seed-based generator_:\n\n```js\nimport { customRandom } from 'nanoid'\n\nconst rng = seedrandom(seed)\nconst nanoid = customRandom('abcdef', 10, size =\u003e {\n  return new Uint8Array(size).map(() =\u003e 256 * rng())\n})\n\nnanoid() //=\u003e \"fbaefaadeb\"\n```\n\nFungsi _callback_ pada `random` harus menerima ukuran array dan mengembalikan sebuah array dengan angka acak.\n\nApabila ingin menggunakan alfabet bawaan NanoID pada fungsi `customRandom`, dapat menggunakan konstanta `urlAlphabet` seperti berikut:\n\n```js\nconst { customRandom, urlAlphabet } = require('nanoid')\nconst nanoid = customRandom(urlAlphabet, 10, random)\n```\n\nAPI asinkronus dan non-secure tidak tersedia untuk fungsi `customRandom`.\n\n\n## Penggunaan\n\n### React\n\nDalam React, tidak ada cara yang benar bila ingin menggunakan Nano ID untuk prop `key`, karena `key` tersebut harus konsisten dalam setiap proses render yang terjadi.\n\n```jsx\nfunction Todos({ todos }) {\n  return (\n    \u003cul\u003e\n      {todos.map(todo =\u003e (\n        /* JANGAN DILAKUKAN! */\n        \u003cli key={nanoid()}\u003e{todo.text}\u003c/li\u003e\n      ))}\n    \u003c/ul\u003e\n  )\n}\n```\n\nKarena hal tersebut, disarankan untuk menggunakan ID yang stabil pada setiap objek yang di-render oleh React.\n\n```jsx\nconst todoItems = todos.map(todo =\u003e \u003cli key={todo.id}\u003e{todo.text}\u003c/li\u003e)\n```\n\nApabila tidak memiliki ID yang stabil pada setiap _item_ yang di-render pada React, lebih baik menggunakan indeks sebuah array sebagai `key` ketimbang menggunakan fungsi `nanoid()`, seperti berikut:\n\n```jsx\nconst todoItems = todos.map((text, index) =\u003e (\n  /* Tetap tidak direkomendasikan, tetapi lebih disarankan dari 'nanoid()'. Lakukan ini\n    apabila setiap objek / item dalam list tidak ada ID yang stabil. */\n  \u003cli key={index}\u003e{text}\u003c/li\u003e\n))\n```\n\n### React Native\n\nReact Native tidak memiliki _built-in random generator_. Digunakan polyfill seperti berikut yang berjalan untuk React Native dan Expo yang bermula dari versi `39.x`.\n\n1. Periksa dokumentasi [`react-native-get-random-values`](https://github.com/LinusU/react-native-get-random-values) dan install di aplikasi.\n2. Import library tersebut sebelum Nano ID.\n\n```js\nimport 'react-native-get-random-values'\nimport { nanoid } from 'nanoid'\n```\n\n### PouchDB dan CouchDB\n\nDalam PouchDB dan CouchDB, ID tidak bisa dimulai dengan underscore `_`. Sebuah _prefix_ dibutuhkan untuk mencegah hal ini terjadi, karena Nano ID mungkin menggunakan `_` sebagai karakter pertama dari ID yang dihasilkan.\n\nID bawaan dapat diubah dengan opsi berikut:\n\n```js\ndb.put({\n  _id: 'id' + nanoid(),\n  …\n})\n```\n\n\n### CLI\n\nNano ID dapat didapatkan dengan cara menggunakan `npx nanoid` pada Terminal. Hanya diperlukan Node.js untuk ini, dan tidak perlu mengunduh dan menginstall Nano ID dalam sistem.\n\n```sh\n$ npx nanoid\nnpx: installed 1 in 0.63s\nLZfXLFzPPR4NNrgjlWDxn\n```\n\nBila ingin mengganti alfabet atau ukuran ID, dapat menggunakan [`nanoid-cli`](https://github.com/twhitbeck/nanoid-cli).\n\n### TypeScript\n\nNano ID memungkinkan untuk mengubah string yang dihasilkan menjadi string opak\ndalam TypeScript. Sebagai contoh:\n\n```ts\ndeclare const userIdBrand: unique symbol\ntype UserId = string \u0026 { [userIdBrand]: true }\n\n// Gunakan parameter tipe secara eksplisit:\nmockUser(nanoid\u003cUserId\u003e())\n\ninterface User {\n  id: UserId\n  name: string\n}\n\nconst user: User = {\n  // Secara otomatis diubah menjadi UserId:\n  id: nanoid(),\n  name: 'Alice'\n}\n```\n\n### Bahasa Pemrograman Lainnya\n\nNano ID telah bermigrasi ke berbagai macam bahasa. Seluruh versi dapat digunakan untuk mendapatkan ID generator yang sama pada sisi klien dan sisi penyedia layanan (_client-side_ dan _server-side_).\n\n- [C#](https://github.com/codeyu/nanoid-net)\n- [C++](https://github.com/mcmikecreations/nanoid_cpp)\n- [Clojure and ClojureScript](https://github.com/zelark/nano-id)\n- [ColdFusion/CFML](https://github.com/JamoCA/cfml-nanoid)\n- [Crystal](https://github.com/mamantoha/nanoid.cr)\n- [Dart \u0026 Flutter](https://github.com/pd4d10/nanoid-dart)\n- [Deno](https://github.com/ianfabs/nanoid)\n- [Elixir](https://github.com/railsmechanic/nanoid)\n- [Gleam](https://github.com/0xca551e/glanoid)\n- [Go](https://github.com/jaevor/go-nanoid)\n- [Haskell](https://github.com/MichelBoucey/NanoID)\n- [Haxe](https://github.com/flashultra/uuid)\n- [Janet](https://sr.ht/~statianzo/janet-nanoid/)\n- [Java](https://github.com/wosherco/jnanoid-enhanced)\n- [Kotlin](https://github.com/viascom/nanoid-kotlin)\n- [MySQL/MariaDB](https://github.com/viascom/nanoid-mysql-mariadb)\n- [Nim](https://github.com/icyphox/nanoid.nim)\n- [OCaml](https://github.com/routineco/ocaml-nanoid)\n- [Perl](https://github.com/tkzwtks/Nanoid-perl)\n- [PHP](https://github.com/hidehalo/nanoid-php)\n- [Python](https://github.com/puyuan/py-nanoid) with [dictionaries](https://pypi.org/project/nanoid-dictionary)\n- [Postgres Extension](https://github.com/spa5k/uids-postgres)\n- [Postgres Native Function](https://github.com/viascom/nanoid-postgres)\n- [R](https://github.com/hrbrmstr/nanoid) (with dictionaries)\n- [Ruby](https://github.com/radeno/nanoid.rb)\n- [Rust](https://github.com/nikolay-govorov/nanoid)\n- [Swift](https://github.com/antiflasher/NanoID)\n- [Unison](https://share.unison-lang.org/latest/namespaces/hojberg/nanoid)\n- [V](https://github.com/invipal/nanoid)\n- [Zig](https://github.com/SasLuca/zig-nanoid)\n\nUntuk environment lainnya, [CLI](#cli) tersedia untuk melakukan generasi ID dari command line / Terminal.\n\n\n## Alat\n\n- [ID Size Calculator](https://zelark.github.io/nano-id-cc/) menunjukkan probabilitas collision ketika melakukan konfigurasi alfabet dan ukuran.\n- [`nanoid-dictionary`](https://github.com/CyberAP/nanoid-dictionary) untuk menggunakan alfabet popular dalam fungsi [`customAlphabet`](#custom-alphabet-or-size)\n- [`nanoid-good`](https://github.com/y-gagar1n/nanoid-good) untuk meyakinkan bahwa ID yang di-generasi tidak memiliki kata-kata yang kurang baik (kasar, tidak sopan, dsb.).\n","funding_links":["https://tidelift.com/funding/github/npm/nanoid","https://github.com/sponsors/ai","https://tidelift.com/security"],"categories":["JavaScript","Packages","Uncategorized","UUID Like","Repository","包","\u003e 3k ★","others","Utilities","ID \u0026 Unique IDs","GIT 仓库","Programming Languages","目录","前端常用","39. 加密/转码",":books: Libraries","Generation","Modules","Unique ID Generation","Инструменты разработчика"],"sub_categories":["Text","Uncategorized","Packages","Text/String","Data","文本","Random","ID Generation","其他","JavaScript","文本处理","24.3 Web Sockets","Universal","Other","Reactive Programming"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fai%2Fnanoid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fai%2Fnanoid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fai%2Fnanoid/lists"}