README.id-ID.md
English | 日本語 | Русский | 简体中文 | Bahasa Indonesia | 한국어 | العربية
Sebuah generator ID yang unik dalam bentuk string yang ringan, aman, serta URL-friendly untuk JavaScript.
"Sebuah tingkat kesempurnaan yang luar biasa, yang mana tidak mungkin untuk tidak dihormati."
A-Za-z0-9_-), karenanya ukuran ID menjadi berkurang dari 36 menjadi 21 simbol.import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
Mendukung penjelajah (browser) modern, IE dengan Babel, Node.js, dan React Native.
Made at <b><a href="https://evilmartians.com/devtools?utm_source=nanoid&utm_campaign=devtools-button&utm_medium=github">Evil Martians</a></b>, product consulting for <b>developer tools</b>.
Nano 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:
Agar timbul kemungkinan collison / duplikasi ID satu dalam satu miliar, perlu dihasilkan 103 triliun UUID v4.
Ada dua buah perbedaan antara Nano ID dan UUID v4:
uuid/v4: 118 bytes dibanding 423 bytes.$ node ./test/benchmark.js
crypto.randomUUID 21,741,317 ops/sec
uuid v4 21,204,378 ops/sec
@napi-rs/uuid 10,236,615 ops/sec
uid/secure 10,567,676 ops/sec
@lukeed/uuid 8,647,481 ops/sec
nanoid 7,800,308 ops/sec
customAlphabet 9,697,350 ops/sec
nanoid for browser 576,759 ops/sec
secure-random-string 529,253 ops/sec
uid-safe.sync 526,459 ops/sec
Non-secure:
uid 31,379,525 ops/sec
nanoid/non-secure 3,678,505 ops/sec
rndm 3,767,185 ops/sec
Konfigurasi pengujian: Framework 13 7840U, Fedora 39, Node.js 21.6.
Lihat artikel yang informatif tentang teori angka acak: Nilai acak yang aman dalam Node.js (English).
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.
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 dan sudah diuji untuk keseragamannya.
Terdokumentasi secara baik. Seluruh algoritma Nano ID sudah terdokumentasi. Lihat komentar di kode sumber.
Kerentanan. Untuk melaporkan sebuah security vulnerability atau kerentanan, mohon menggunakan Tidelift Security Contact. Tidelift akan mengkoordinasikan pembetulan dan penyingkapan dari kerentanan tersebut.
npm install nanoid
Nano ID 5 hanya tersedia untuk proyek, pengujian, atau skrip ESM Node.js. Untuk CommonJS Anda memerlukan Nano ID 3.x (kami masih mendukungnya):
npm install nanoid@3
Apabila 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.
import { nanoid } from 'https://cdn.jsdelivr.net/npm/nanoid/nanoid.js'
Nano ID memiliki dua API: normal dan non-secure.
Bawaannya, 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).
Penggunaan Nano ID yang aman dan yang paling mudah.
Dalam 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).
import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
Apabila ingin mengurangi ukuran ID (dan meningkatkan probabilitas collision), dapat dimasukkan size sebagai argumen dari fungsi nanoid().
nanoid(10) //=> "IRFa-VaY2b"
Jangan lupa memeriksa tingkat keamanan dari ukuran ID dalam situs ID collision probability calculator.
Dapat digunakan pula custom alphabet atau random generator yang lain.
Konfigurasi 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.
import { nanoid } from 'nanoid/non-secure'
const id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqLJ"
customAlphabet digunakan untuk membuat Nano ID dengan alfabet dan ukuran ID yang sesuai dengan kebutuhan (dapat dikustomisasi).
import { customAlphabet } from 'nanoid'
const nanoid = customAlphabet('1234567890abcdef', 10)
model.id = nanoid() //=> "4f90d13a42"
Ketika menggunakan fungsi ini, jangan lupa untuk memeriksa keamanan alfabet dan ukuran ID dalam ID collision probability calculator. Untuk lebih banyak alfabet, dapat menggunakan nanoid-dictionary.
Alfabet harus terbentuk dari 256 simbol atau lebih kecil. Selain itu, keamanan algoritma generasi yang berada di dalam library ini tidak dijamin aman.
API non-secure yang dapat dikustomisasi dengan customAlphabet pun tersedia disini:
import { customAlphabet } from 'nanoid/non-secure'
const nanoid = customAlphabet('1234567890abcdef', 10)
user.id = nanoid()
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).
Pada contoh berikut, digunakan seed-based generator:
import { customRandom } from 'nanoid'
const rng = seedrandom(seed)
const nanoid = customRandom('abcdef', 10, size => {
return new Uint8Array(size).map(() => 256 * rng())
})
nanoid() //=> "fbaefaadeb"
Fungsi callback pada random harus menerima ukuran array dan mengembalikan sebuah array dengan angka acak.
Apabila ingin menggunakan alfabet bawaan NanoID pada fungsi customRandom, dapat menggunakan konstanta urlAlphabet seperti berikut:
const { customRandom, urlAlphabet } = require('nanoid')
const nanoid = customRandom(urlAlphabet, 10, random)
API asinkronus dan non-secure tidak tersedia untuk fungsi customRandom.
Dalam 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.
function Todos({ todos }) {
return (
<ul>
{todos.map(todo => (
/* JANGAN DILAKUKAN! */
<li key={nanoid()}>{todo.text}</li>
))}
</ul>
)
}
Karena hal tersebut, disarankan untuk menggunakan ID yang stabil pada setiap objek yang di-render oleh React.
const todoItems = todos.map(todo => <li key={todo.id}>{todo.text}</li>)
Apabila 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:
const todoItems = todos.map((text, index) => (
/* Tetap tidak direkomendasikan, tetapi lebih disarankan dari 'nanoid()'. Lakukan ini
apabila setiap objek / item dalam list tidak ada ID yang stabil. */
<li key={index}>{text}</li>
))
React Native tidak memiliki built-in random generator. Digunakan polyfill seperti berikut yang berjalan untuk React Native dan Expo yang bermula dari versi 39.x.
react-native-get-random-values dan install di aplikasi.import 'react-native-get-random-values'
import { nanoid } from 'nanoid'
Dalam 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.
ID bawaan dapat diubah dengan opsi berikut:
db.put({
_id: 'id' + nanoid(),
…
})
Nano 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.
$ npx nanoid
npx: installed 1 in 0.63s
LZfXLFzPPR4NNrgjlWDxn
Bila ingin mengganti alfabet atau ukuran ID, dapat menggunakan nanoid-cli.
Nano ID memungkinkan untuk mengubah string yang dihasilkan menjadi string opak dalam TypeScript. Sebagai contoh:
declare const userIdBrand: unique symbol
type UserId = string & { [userIdBrand]: true }
// Gunakan parameter tipe secara eksplisit:
mockUser(nanoid<UserId>())
interface User {
id: UserId
name: string
}
const user: User = {
// Secara otomatis diubah menjadi UserId:
id: nanoid(),
name: 'Alice'
}
Nano 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).
Untuk environment lainnya, CLI tersedia untuk melakukan generasi ID dari command line / Terminal.
nanoid-dictionary untuk menggunakan alfabet popular dalam fungsi customAlphabetnanoid-good untuk meyakinkan bahwa ID yang di-generasi tidak memiliki kata-kata yang kurang baik (kasar, tidak sopan, dsb.).