Representação de datas como chaves de texto curtas e mínimamente dedutíveis, favorecendo a ordem da mais atual para a menos atual.
Uma codokey representa uma data do calendário, em seqüencia de dígitos (radix-36) e em contagem regressiva, a partir da subtração dos valores máximos de cada campo pelos seus respectivos valores. É composta inicialmente pelo ano (campo mais significativo) até chegar ao campo da precisão escolhida (menos significativo) e pode ter tamanhos variados, a depender da finalidade de sua utilização para se evitar colisões, podendo chegar a nanosegundos, por exemplo.
Os valores máximos de ano e de fração de segundo são pré estabelecidos em um
contexto compartilhado entre codokeys. Se uma resolução de um século for mais
que o suficiente para um contexto de chaves específicas, por exemplo, seu valor
máximo de ano poderia ser reduzido a 99
. A fração de segundo também pode ser
expandida para suportar mais décimos (99
), centésimos (999
), milisegundos
(9999
) e etc.
Existe um parâmetro de contexto a mais para o campo de ano (desde ou ano zero), que serve para encurtar o resutado da chave. Para defini-lo considere que os campos de uma codokey não suportam valores negativos.
São assumidos por padrão:
1970
– como o ano zero;3265
– como o valor máximo para ano (1970 + 1295
, sendo1295 = zz
em radix-36);9
– como o valor máximo para fração de segundo.
Para os outros campos, seus valores máximos são determinados pela lógica do calendário.
Depois de estabelecer um contexto de codokeys, alterá-lo requer recalcular todas as suas chaves existentes a partir da data inicial de cada uma para um novo contexto e descartar o anterior, mantendo assim a integridade delas. Portanto fazer uma previsão mínima do tempo de vida e de volume de codokeys antes de definir os parâmetros de um contexto, evitará problemas precoces de colisão.
Outro parâmetro determinante no tamanho de uma codokey é a precisão, podendo ter os seguintes valores:
0
– uma chave por ano sem colisões;1
– uma chave por mês sem colisões;2
– uma chave por dia sem colisões;3
– uma chave por hora sem colisões;4
– uma chave por minuto sem colisões;5
– uma chave por segundo sem colisões;6
– mais de uma chave por segundo (colisão limitada ao valor máximo para fração de segundo do contexto).
A precisão pode variar entre chaves de um mesmo contexto, suportando pequenas e improváveis colisões, fazendo com que as codokeys deste contexto variem também em seu tamanho. Não é recomendado quando concatenadas em chaves maiores, com sufixo por exemplo, para isso é melhor considerar este como um parâmetro de contexto, utilizando uma única precisão que garanta também um tamanho fixo para todas as codokeys.
O valor padrão de precisão do algoritmo é assumido como 2
(dia).
É possível decodificar uma codokey de forma a identificar a sua data de origem e até deduzí-la porém o resultado será limitado à precisão utilizada na geração da chave.
A imutabilidade do contexto é outra limitação conhecida pois afeta diretamente o valor e tamanho de cada campo na seqüência de dígitos da chave.
Atualmente o algoritmo não ignora os campos mais significativos, não sendo ideal para casos de uso onde são irrelevantes e poderiam ser ignorados por necessidade de resultados com tamanho mais compacto.
Se você precisa gerar arquivos ou diretórios de forma cronológica por exemplo, poderia utilizar codokeys como um prefixo curto para os nomes, de tamanho fixo, com ordenação intuitiva e podendo ser concatenadas com um texto qualquer, como semver.
Não é um método ideal para identificadores (ID), porém pode ser utilizada para compor identificadores robustos.
Alguns exemplos de codokeys utilizando os parâmetros de contexto padrão:
key | ISO 8601 |
---|---|
yj |
2022-01-01T00:00:00.000Z |
zz |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj0 |
2022-12-01T00:00:00.000Z |
zzb |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj00 |
2022-12-31T00:00:00.000Z |
zzbu |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj000 |
2022-12-31T23:00:00.000Z |
zzbun |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj00000 |
2022-12-31T23:59:00.000Z |
zzbun1n |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj0000000 |
2022-12-31T23:59:59.000Z |
zzbun1n1n |
1970-01-01T00:00:00.000Z |
key | ISO 8601 |
---|---|
yj00000000 |
2022-12-31T23:59:59.900Z |
zzbun1n1n9 |
1970-01-01T00:00:00.000Z |
key | CodoTimestamp (JS) |
---|---|
yj00000000000 |
{"value":1672531199,"split":999.999} |
zzbun1n1nlflr |
{"value":0,"split":0} |
- Node.js e browsers (Typescript).