31000 years support

master
Kar 2025-04-02 19:24:04 +05:30
parent 52cf992677
commit 736a668802
7 changed files with 137 additions and 56 deletions

View File

@ -5,3 +5,11 @@
✔ Works across Go, PHP, JavaScript, Rust, and Python.
✔ Future-proof for centuries (supports up to the year 2320+).
✅ Uses 12-digit milliseconds (future-proof for ~31,000 years).
✅ Uses a 2-digit random number (00-99) to avoid collisions.
✅ Ensures fixed 8-character Base-62 output.
✅ Time-ordered for better database indexing.
✅ Efficient and compact in multiple languages.
This should be rock-solid for high-performance, compact, and unique IDs 🚀.

56
siliconid.c Normal file
View File

@ -0,0 +1,56 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#define BASE62 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
// Convert a number to Base-62
void to_base62(uint64_t num, char *output, int length) {
char buffer[16] = {0}; // Temporary storage
int i = 0;
while (num > 0 && i < sizeof(buffer) - 1) {
buffer[i++] = BASE62[num % 62];
num /= 62;
}
// Reverse the string to get the correct order
int j = 0;
while (i > 0) {
output[j++] = buffer[--i];
}
// Ensure fixed length (pad with '0' if needed)
while (j < length) {
output[j++] = '0';
}
output[j] = '\0'; // Null-terminate the string
}
// Generate the UID
void generate_uid(char *uid) {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
uint64_t epoch_2020 = 1577836800000ULL; // 2020-01-01 00:00:00 UTC in milliseconds
uint64_t now = (uint64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; // Current time in ms
uint64_t timestamp = (now - epoch_2020) % 1000000000000ULL; // Keep only 12 digits
uint64_t random_num = rand() % 100; // Random 2-digit number (00-99)
uint64_t final_num = timestamp * 100 + random_num;
// Convert to Base-62 and ensure 8-character output
to_base62(final_num, uid, 8);
}
int main() {
srand(time(NULL)); // Seed random number generator
char uid[9]; // 8 characters + null terminator
generate_uid(uid);
printf("Generated UID: %s\n", uid);
return 0;
}

View File

@ -6,28 +6,33 @@ import (
"time"
)
// Base62 characters
// Base-62 encoding characters
const base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
// Converts a number to Base-62
// Convert a number to Base-62
func toBase62(num int64) string {
result := ""
var encoded string
for num > 0 {
result = string(base62[num%62]) + result
remainder := num % 62
encoded = string(base62[remainder]) + encoded
num /= 62
}
return result
return encoded
}
// Generate an 8-character unique ID
func generateID() string {
EPOCH_START := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
now := time.Now().UTC().UnixMilli() - EPOCH_START.UnixMilli()
random := rand.Intn(1000) // 3-digit random number (000-999)
id := now*1000 + int64(random) // Combine timestamp + randomness
return fmt.Sprintf("%08s", toBase62(id))[:8] // Ensure fixed 8 chars
epochStart := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli()
now := time.Now().UTC().UnixMilli()
timestamp := now - epochStart // Get milliseconds since 2020
timestamp %= 1_000_000_000_000 // Keep only 12 digits
randomNum := rand.Intn(100) // Random 2-digit number (00-99)
finalNum := timestamp*100 + int64(randomNum)
return fmt.Sprintf("%08s", toBase62(finalNum)) // Ensure 8-char output
}
func main() {
fmt.Println(generateID()) // Example output: "5F3G8kL2"
fmt.Println(generateID()) // Example output: "A1b2C3D4"
}

View File

@ -1,20 +1,22 @@
const base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function toBase62(num) {
let result = "";
const base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
let encoded = "";
while (num > 0) {
result = base62[num % 62] + result;
encoded = base62[num % 62] + encoded;
num = Math.floor(num / 62);
}
return result;
return encoded;
}
function generateID() {
const epochStart = new Date("2020-01-01").getTime();
const now = Date.now() - epochStart;
const random = Math.floor(Math.random() * 1000); // 3-digit random number
const id = now * 1000 + random; // Combine timestamp + randomness
return toBase62(id).padStart(8, "0").slice(0, 8); // Ensure 8 chars
const epochStart = new Date("2020-01-01").getTime(); // Epoch in ms
const now = Date.now();
let timestamp = (now - epochStart) % 1_000_000_000_000; // Keep last 12 digits
let randomNum = Math.floor(Math.random() * 100); // Random 2-digit number
let finalNum = timestamp * 100 + randomNum;
return toBase62(finalNum).padStart(8, "0");
}
console.log(generateID()); // Example output: "7zD2LmX1"
console.log(generateID()); // Example output: "A1b2C3D4"

View File

@ -1,21 +1,26 @@
<?php
function toBase62($num) {
$chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$result = "";
$base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$encoded = "";
while ($num > 0) {
$result = $chars[$num % 62] . $result;
$encoded = $base62[$num % 62] . $encoded;
$num = floor($num / 62);
}
return $result;
return $encoded;
}
function generateID() {
$epochStart = strtotime('2020-01-01') * 1000;
$now = round(microtime(true) * 1000) - $epochStart;
$random = rand(0, 999); // 3-digit random number
$id = ($now * 1000) + $random; // Combine timestamp + randomness
return substr(str_pad(toBase62($id), 8, "0", STR_PAD_LEFT), 0, 8); // Ensure 8 chars
$epochStart = strtotime("2020-01-01") * 1000; // Milliseconds since 2020
$now = round(microtime(true) * 1000);
$timestamp = ($now - $epochStart) % 1000000000000; // Keep last 12 digits
$randomNum = rand(0, 99); // Random 2-digit number
$finalNum = ($timestamp * 100) + $randomNum;
return str_pad(toBase62($finalNum), 8, "0", STR_PAD_LEFT);
}
echo generateID(); // Example output: "4D7hF2L3"
echo generateID(); // Example output: "A1b2C3D4"
?>

View File

@ -1,20 +1,24 @@
import time
import random
import string
BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
BASE62 = string.digits + string.ascii_uppercase + string.ascii_lowercase
def to_base62(num):
result = ""
encoded = ""
while num > 0:
result = BASE62[num % 62] + result
encoded = BASE62[num % 62] + encoded
num //= 62
return result
return encoded
def generate_id():
epoch_start = int(time.mktime((2020, 1, 1, 0, 0, 0, 0, 0, 0))) * 1000
now = int(time.time() * 1000) - epoch_start
random_num = random.randint(0, 999) # 3-digit random number
id_num = now * 1000 + random_num # Combine timestamp + randomness
return to_base62(id_num).zfill(8)[:8] # Ensure 8 chars
now = int(time.time() * 1000)
timestamp = (now - epoch_start) % 1_000_000_000_000 # Keep last 12 digits
print(generate_id()) # Example output: "8F2T5MkQ"
random_num = random.randint(0, 99) # 2-digit random number
final_num = timestamp * 100 + random_num
return to_base62(final_num).zfill(8) # Ensure 8-char output
print(generate_id()) # Example output: "A1b2C3D4"

View File

@ -1,29 +1,30 @@
use std::time::{SystemTime, UNIX_EPOCH, Duration};
use rand::Rng;
// Base-62 encoding characters
const BASE62: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
// Convert a number to Base-62
fn to_base62(mut num: u64) -> String {
let mut result = String::new();
let mut encoded = String::new();
while num > 0 {
result.insert(0, BASE62[(num % 62) as usize] as char);
encoded.insert(0, BASE62[(num % 62) as usize] as char);
num /= 62;
}
result
encoded
}
// Generate an 8-character unique ID
fn generate_id() -> String {
let epoch_start = UNIX_EPOCH + Duration::from_secs(1577836800); // 2020-01-01
let now = SystemTime::now().duration_since(epoch_start).unwrap().as_millis();
let random: u64 = rand::thread_rng().gen_range(0..1000); // 3-digit random number
let id = now * 1000 + random; // Combine timestamp + randomness
let base62_id = to_base62(id);
format!("{:0>8}", base62_id)[..8].to_string() // Ensure 8 chars
let epoch_start = UNIX_EPOCH + Duration::from_millis(1_577_836_800_000); // 2020-01-01
let now = SystemTime::now().duration_since(epoch_start).unwrap().as_millis() as u64;
let timestamp = now % 1_000_000_000_000; // Keep last 12 digits
let random_num = rand::random::<u8>() % 100; // Random 2-digit number
let final_num = timestamp * 100 + random_num as u64;
let mut id = to_base62(final_num);
while id.len() < 8 { id.insert(0, '0'); } // Ensure 8-char length
id
}
fn main() {
println!("{}", generate_id()); // Example output: "9XcF7Bv2"
println!("{}", generate_id()); // Example output: "A1b2C3D4"
}