Generate Youtube like ID in Different Programming Languages
YouTube is one of the most popular video hosting and most popular social but I was curious about how to generate a youtube video ID. So let us look at how we can create a youtube ID using different languages.
Currently, I have been given a task to create a media file system for managing files. And it came to my mind how do I create an identity for a file? I can use the default UUID generated by the database but I like to explore more like creating my own ID. After searching Google a lot of times I was able to find a piece of code and tried to convert them into different languages so here you go.
To be precise YouTube uses 64-bit numbers to generate the video ID which equals to 73,786,976,294,838,206,464 possible IDs. For more information about the math and number theory behind this, I can recommend the excellent YouTube video "Will YouTube Ever Run Out Of Video IDs?" from Tom Scott.
PHP
function generateHash(): string
{
$bytes = random_bytes(8);
$base64 = base64_encode($bytes);
return rtrim(strtr($base64, '+/', '-_'), '=');
}
Python
import base64
import secrets
def generate_hash() -> str:
bytes = secrets.token_bytes(8)
base64_str = base64.urlsafe_b64encode(bytes).rstrip(b"=")
return base64_str.decode("utf-8").translate(str.maketrans("+/", "-_"))
Java
import java.util.Base64;
import java.security.SecureRandom;
public class HashGenerator {
public static String generateHash() {
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[8];
random.nextBytes(bytes);
String base64 = Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
return base64.replace('+', '-').replace('/', '_');
}
}
JavaScript
function generateHash() {
const bytes = new Uint8Array(8);
crypto.getRandomValues(bytes);
const base64 = btoa(String.fromCharCode.apply(null, bytes)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
return base64;
}
C#
using System.Security.Cryptography;
using System.Text;
public class HashGenerator {
public static string GenerateHash() {
var bytes = new byte[8];
using (var rng = new RNGCryptoServiceProvider()) {
rng.GetBytes(bytes);
}
var base64 = Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_').TrimEnd('=');
return base64;
}
}
TypeScript
function generateHash(): string {
const bytes = new Uint8Array(8);
window.crypto.getRandomValues(bytes);
const base64 = btoa(String.fromCharCode.apply(null, bytes))
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=+$/, "");
return base64;
}
Conclusion
With that said you can create your own function or follow the codes above. Also, I recommend you add date time generated integer and convert it to something so that everything cannot be replicated, especially if it's based on date and time.