Last Updated: 3/9/2026
Language Ports
Nano ID has been ported to over 20 programming languages.
Why Use Language Ports?
✅ Consistent IDs across your stack - Same format in frontend, backend, and services ✅ No API calls needed - Generate IDs locally in any language ✅ Same security guarantees - All ports use cryptographic random generators
Available Ports
C
Repository: lukateras/nanoid.h
#include "nanoid.h"
char id[NANOID_SIZE];
nanoid(id);
printf("%s\n", id);C#
Repository: codeyu/nanoid-net
using Nanoid;
var id = Nanoid.Generate();
Console.WriteLine(id);C++
Repository: mcmikecreations/nanoid_cpp
#include "nanoid.h"
std::string id = nanoid::generate();
std::cout << id << std::endl;Clojure / ClojureScript
Repository: zelark/nano-id
(require '[nano-id.core :refer [nano-id]])
(nano-id) ;; => "V1StGXR8_Z5jdHi6B-myT"
(nano-id 10) ;; => "IRFa-VaY2b"ColdFusion / CFML
Repository: JamoCA/cfml-nanoid
id = createObject("component", "nanoid").generate();
writeOutput(id);Crystal
Repository: mamantoha/nanoid.cr
require "nanoid"
id = Nanoid.generate
puts idDart / Flutter
Repository: pd4d10/nanoid-dart
import 'package:nanoid/nanoid.dart';
void main() {
var id = nanoid();
print(id);
}Elixir
Repository: railsmechanic/nanoid
Nanoid.generate()
# => "V1StGXR8_Z5jdHi6B-myT"
Nanoid.generate(10)
# => "IRFa-VaY2b"Gleam
Repository: 0xca551e/glanoid
import glanoid
pub fn main() {
let id = glanoid.generate()
io.println(id)
}Go
Repository: matoous/go-nanoid
import "github.com/matoous/go-nanoid/v2"
id, err := gonanoid.New()
fmt.Println(id)Haskell
Repository: MichelBoucey/NanoID
import Data.NanoID
main = do
id <- nanoID
putStrLn idHaxe
Repository: flashultra/uuid
import uuid.NanoId;
var id = NanoId.generate();
trace(id);Janet
Repository: ~statianzo/janet-nanoid
(import nanoid)
(def id (nanoid/generate))
(print id)Java
Repository: wosherco/jnanoid-enhanced
import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
String id = NanoIdUtils.randomNanoId();
System.out.println(id);Kotlin
Repository: viascom/nanoid-kotlin
import com.viascom.nanoid.NanoId
val id = NanoId.generate()
println(id)MySQL / MariaDB
Repository: viascom/nanoid-mysql-mariadb
SELECT NANOID();
-- V1StGXR8_Z5jdHi6B-myT
SELECT NANOID(10);
-- IRFa-VaY2bNim
Repository: icyphox/nanoid.nim
import nanoid
let id = generate()
echo idOCaml
Repository: routineco/ocaml-nanoid
let id = Nanoid.gen ()
let () = print_endline idPerl
Repository: tkzwtks/Nanoid-perl
use Nanoid;
my $id = nanoid();
print "$id\n";PHP
Repository: hidehalo/nanoid-php
use Hidehalo\Nanoid\Client;
$client = new Client();
$id = $client->generateId();
echo $id;Python
Native implementation: puyuan/py-nanoid
from nanoid import generate
id = generate()
print(id)With dictionaries: nanoid-dictionary
from nanoid import generate
import nanoid_dictionary
id = generate(alphabet=nanoid_dictionary.lowercase, size=12)Fast (Rust-based): oliverlambson/fastnanoid
import fastnanoid
id = fastnanoid.generate()
print(id)PostgreSQL
Extension: spa5k/uids-postgres
CREATE EXTENSION nanoid;
SELECT nanoid();
-- V1StGXR8_Z5jdHi6B-myTNative function: viascom/nanoid-postgres
SELECT nanoid();
SELECT nanoid(10);
SELECT nanoid(10, 'abcdef0123456789');R
Repository: hrbrmstr/nanoid
library(nanoid)
id <- nano_id()
print(id)Ruby
Repository: radeno/nanoid.rb
require 'nanoid'
id = Nanoid.generate
puts idRust
Repository: nikolay-govorov/nanoid
use nanoid::nanoid;
fn main() {
let id = nanoid!();
println!("{}", id);
}Swift
Repository: ShivaHuang/swift-nanoid
import Nanoid
let id = Nanoid.generate()
print(id)Unison
Repository: hojberg/nanoid
use .nanoid
id = generate ()V
Repository: invipal/nanoid
import invipal.nanoid
id := nanoid.generate()
println(id)Zig
Repository: SasLuca/zig-nanoid
const nanoid = @import("nanoid");
pub fn main() !void {
const id = try nanoid.generate();
std.debug.print("{s}\n", .{id});
}CLI (Command Line)
Generate IDs from the terminal without installing anything:
$ npx nanoid
LZfXLFzPPR4NNrgjlWDxnCustom size:
$ npx nanoid --size 10
L3til0JS4zCustom alphabet:
$ npx nanoid --alphabet abc --size 15
bccbcabaabaccabSee CLI Usage for more options.
Using Multiple Languages
All ports generate compatible IDs:
Frontend (JavaScript):
import { nanoid } from 'nanoid'
const id = nanoid() // "V1StGXR8_Z5jdHi6B-myT"Backend (Python):
from nanoid import generate
id = generate() # "IRFa-VaY2b9k2L3mN5pR7"Database (PostgreSQL):
INSERT INTO users (id, email) VALUES (nanoid(), 'user@example.com');All generate the same format: 21-character URL-safe strings.
Implementation Notes
All ports should:
✅ Use cryptographically secure random generators ✅ Implement uniform distribution (no modulo bias) ✅ Default to 21 characters with URL-safe alphabet ✅ Support custom sizes and alphabets
⚠️ Check port documentation for:
- Security guarantees
- Custom alphabet support
- Performance characteristics
- Maintenance status
Contributing a Port
Want to port Nano ID to a new language?
- Use cryptographic random - Platform’s CSPRNG (not Math.random() equivalent)
- Implement uniform distribution - Avoid modulo bias (see Security Details)
- Match default behavior - 21 chars, URL-safe alphabet
- Add tests - Verify uniformity and uniqueness
- Document - Installation, usage, security guarantees
See the JavaScript implementation for reference (only ~20 lines).
Related
- Core API - JavaScript API reference
- Security Details - Implementation requirements
- CLI Usage - Command-line tool