Skip to Content
ReferenceLanguage Ports

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 id

Dart / 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 id

Haxe

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-VaY2b

Nim

Repository: icyphox/nanoid.nim 

import nanoid let id = generate() echo id

OCaml

Repository: routineco/ocaml-nanoid 

let id = Nanoid.gen () let () = print_endline id

Perl

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-myT

Native 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 id

Rust

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 LZfXLFzPPR4NNrgjlWDxn

Custom size:

$ npx nanoid --size 10 L3til0JS4z

Custom alphabet:

$ npx nanoid --alphabet abc --size 15 bccbcabaabaccab

See 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?

  1. Use cryptographic random - Platform’s CSPRNG (not Math.random() equivalent)
  2. Implement uniform distribution - Avoid modulo bias (see Security Details)
  3. Match default behavior - 21 chars, URL-safe alphabet
  4. Add tests - Verify uniformity and uniqueness
  5. Document - Installation, usage, security guarantees

See the JavaScript implementation  for reference (only ~20 lines).