De acordo com a documentação do ObjectId , essa string que você vê é uma representação hexadecimal dos 12 bytes. Não é Unicode ou mesmo uma string. Na verdade é um número.
Um byte tem 8 bits, o que significa que pode ter 2^8 ==256 valores possíveis (consulte Byte ).
Como você representa um número com 256 valores possíveis de forma sucinta? Que tal representá-lo como 16^2? Você pode conseguir isso usando 2 valores hexadecimais (base 16). A única coisa que você precisa inventar é um sistema de numeração que vá para 16 em vez de 10.
Na verdade, usamos letras de
a
para f
para representar os valores de 10 a 15. Assim, um byte pode ser representado em dois números hexadecimais. Acontece de usar
a
para f
já que não podíamos nos dar ao trabalho de inventar símbolos especiais para eles. Não são letras. São números. Portanto, não, a string que você vê no ObjectId não representa 24 bytes. Cada 2 caracteres representam um byte. 24 números hexadecimais ==12 bytes.