Skip to content

Instantly share code, notes, and snippets.

@solenoid
Created November 17, 2011 04:49
Show Gist options
  • Save solenoid/1372386 to your computer and use it in GitHub Desktop.
Save solenoid/1372386 to your computer and use it in GitHub Desktop.
javascript ObjectId generator
var mongoObjectId = function () {
var timestamp = (new Date().getTime() / 1000 | 0).toString(16);
return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() {
return (Math.random() * 16 | 0).toString(16);
}).toLowerCase();
};
@zulucoda
Copy link

nice 👍

@Jompau
Copy link

Jompau commented Dec 7, 2017

Thank you for this! I implemented this in C# with Unity, here's my version which returns a string:

private string GenerateID ()
{
Int64 val = 0;
var st = new DateTime(1970,1,1);
TimeSpan t = (DateTime.Now.ToUniversalTime () - st);
val = (Int64) (t.TotalMilliseconds+0.5);
char[] startVal = val.ToString ("X").ToCharArray ();
string timestamp = "";
for (int i = 0; i < 10; i++)
{
timestamp += startVal[i];
}
int num = 0;
for (int i = 0; i < 14; i++)
{
num = UnityEngine.Random.Range (1,16);
timestamp += num.ToString ("X");
}
return timestamp.ToLower ();
}

Maybe someone will find it useful :)

@TheBlackDude
Copy link

Thank You, just what am looking for

@carvakaguru
Copy link

I wrote one for Lua -

function mongoObjectId()
    return string.format("%x", os.time())..string.gsub('xxxxxxxxxxxxxxxx', 'x', function (c)
        return string.format('%x', math.random(0, 15))
    end)
end

@lolpez
Copy link

lolpez commented Apr 4, 2018

OMG thank you so much

@jairovsky
Copy link

👌

@md8n
Copy link

md8n commented Apr 22, 2018

And TypeScript - returning the whole oid structure

generateId(): {} {
  const timestamp = (new Date().getTime() / 1000 | 0).toString(16);
  const oid = timestamp + 'xxxxxxxxxxxxxxxx'
    .replace(/[x]/g, _ => (Math.random() * 16 | 0).toString(16))
    .toLowerCase();

  return { "$oid": oid };
}

@ramyhhh
Copy link

ramyhhh commented Sep 24, 2018

The code has a bug, because if random resulted 1 then (Math.random() * 16 | 0).toString(16) will result "10" which is two characters, leading to invalid ObjectId that is supposed to be 24 characters long.

@hieunc229
Copy link

This random string generate function is +50% faster than the method used in the function above (measured by jsben.ch).

function getRandomString(length) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    var randS = "";

    while(length > 0) {
        randS += chars.charAt(Math.floor(Math.random() * chars.length));
        length--;
    }
    return randS;
}

Ps: generated string will contain uppercase characters, remove upper characters in var chars if you don't want them

@rogeralbinoi
Copy link

Thanks! ;)

@GoKooma
Copy link

GoKooma commented Jan 19, 2019

Cool thank you! :) 👍

@skrrp
Copy link

skrrp commented Mar 22, 2019

Thank you so much.

@DanielPopOut
Copy link

👍 Good job

@ElianCordoba
Copy link

Thanks!

@loliconer
Copy link

The code has a bug, because if random resulted 1 then (Math.random() * 16 | 0).toString(16) will result "10" which is two characters, leading to invalid ObjectId that is supposed to be 24 characters long.

Math.random() returns [0, 1), inclusive of 0, but not 1.

@trylovetom
Copy link

@ticdenis
Copy link

Based on the above comments I did a sh alias
alias objectidgen='node -e "console.log((function objectidgen(length = 16) {var timestamp = (new Date().getTime() / 1000 | 0).toString(16);return timestamp + \"xxxxxxxxxxxxxxxx\".replace(/[x]/g, _ => (Math.random() * 16 | 0).toString(16)).toLowerCase();})())"'
For macOS users:
alias objectidgen='node -e "console.log((function objectidgen(length = 16) {var timestamp = (new Date().getTime() / 1000 | 0).toString(16);return timestamp + \"xxxxxxxxxxxxxxxx\".replace(/[x]/g, _ => (Math.random() * 16 | 0).toString(16)).toLowerCase();})())" | pbcopy'

@vfa-tamhh
Copy link

Thanks! This code useful for me!

@cassiolacerda
Copy link

Thank you so much man!!!

@stubbyteam
Copy link

Thank you so much man!!!

@killshot13
Copy link

I appreciate that you shared this. It is a simple, logical function and integrates nicely with my Express backend.

@prakashsellathurai
Copy link

@solenoid what about the collision of this random id generation method?

@thauealfredo
Copy link

Perfect, thanks!!

@BathriNathan
Copy link

BathriNathan commented Oct 29, 2021

simple and quick solution. thanks

here is the function in coffee script:
mongoObjectId: () ->
timestamp = ((new Date).getTime() / 1000 | 0).toString(16)
timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, ->
(Math.random() * 16 | 0).toString 16
).toLowerCase()

@fabiofa87
Copy link

It saved my life. lol

Thanks dude!

@glafer
Copy link

glafer commented Feb 15, 2023

Thanks!

@mokiding
Copy link

mokiding commented Jul 3, 2023

@pedrogardim
Copy link

Thanks a lot, it was very useful!

I made a Golang version for a project

func mongoObjectId() string {
	ts := time.Now().UnixMilli() / 1000
	id := strconv.FormatInt(ts, 16)
	for i := 0; i < 16; i++ {
		id += fmt.Sprintf("%x", rand.Intn(16))
	}
	return id
}

@pacifiquem
Copy link

Impl in rust:

use chrono::Utc;
use rand::Rng;
use std::fmt;

fn mongo_object_id() -> String {
    let ts = Utc::now().timestamp_millis() / 1000;
    let mut id = format!("{:x}", ts);
    
    for _ in 0..16 {
        let random_digit = rand::thread_rng().gen_range(0..16);
        id.push_str(&format!("{:x}", random_digit));
    }

    id
}

fn main() {
    let object_id = mongo_object_id();
    println!("{}", object_id);
}

// [dependencies]
// chrono = "0.4"
// rand = "0.8"

@berdfandrade
Copy link

A simple python implementation

import time
import random

def mongo_object_id():
    timestamp = hex(int(time.time()))[2:]
    rest = ''.join([random.choice('0123456789abcdef') for _ in range(16)])
    
    return (timestamp + rest).lower()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment