Se eu declarar uma coluna serial
no PostgreSql, ela será incrementada automaticamente em uma sequência ordinal. O resultado final pode não ser contíguo devido a reversões e outros enfeites, mas é mais ou menos ordinal.
Eu tenho uma tabela de usuários onde os ids do usuário são definidos como serial
e, portanto, são incrementados a partir de 1 ... mas prefiro que não sejam, pois parece pedir um ataque de número de sequência de algum tipo.
Existe uma maneira relativamente fácil e relativamente eficiente de criar um ID artificial automático no PostgreSQL de forma que os IDs sejam espaçados aleatoriamente e você não deve esperar que o ID 987654321 siga o ID 987654320?
Além do fato de eu achar que você está se dando uma falsa sensação de segurança, você pode fazer o que quiser reservando a metade superior do identificador para a sequência 'real' e preenchendo a metade inferior com bits aleatórios:
dbfiddle aqui
Não há nenhuma razão para querer isso. Algumas pessoas pensam que acrescenta algo à segurança. Eles estão absolutamente errados. Não seja uma dessas pessoas.
Se você absolutamente deve fazer algo assim, possua-o. Gere uma tabela com 4,2 bilhões de IDs e aleatorize a ordem dela.
Acho que qualquer um desses métodos é pelo menos um passo na direção certa, são menos insanos.
Comparação com a resposta de Jack Douglas
Usando a MATEMÁTICA existe uma ideia chamada função sobrejetora . Isso significa que você está mapeando um domínio para outro domínio. Aqui está um exemplo em decimal:
É verdade para todos os inteiros de
x
tal que0<y<1
. Portanto, se você simplesmente truncar, poderá voltar parax
. Isso não adiciona nenhuma segurança,Dada a saída, o que é
x
para tudo isso? Dica: É 42. A escolha de resposta de Jack é aleatóriay
adiciona-a à entrada da mesma forma (mas em binário) e armazena-a no banco de dados. Se é isso que você quer, então faça isso (também pode ser importante ressaltar que a sequência de Jack também é ordinal com uma vindo após a outra, mesmo que não seja consecutiva).Minha resposta leva uma lista de todos os valores no domínio de int4. Randomiza o pedido e os armazena em uma tabela. Sem essa tabela, você nunca poderá voltar aos seus IDs sequenciais originais: é apenas uma tabela de ofuscação superficial e inútil que você gostará de abandonar ou não implementar porque é muito boba. Mas você nunca pode obter o valor original sem essa tabela.