Vendo um código do Gonçalo em em outra área, resolvi abordar este assunto bastante. Que é a matemática dos hashs.
A tempos e tempos procuramos como fazer hashs rápidos e eficientes, mas nunca conseguimos! Basicamente hash é uma especie de codificação que não pode ser voltada atrás. Em grande parte dos casos é feita com a soma dos caracteres mais a representação em letras.
Muitos hashs são famosos, mas poucos são eficientes. Um deles que uso e conheço é MD5, apesar de ser bastante eficiente atualmente, ainda está longe de ser totalmente seguro. Isto porque a taxa de colisões é relativamente grande. Lembrando que taxa de colisões é o número de palavras que tem o mesmo hash. Isto ocorre porque matematicamente é impossível representar milhões de cadeias de caracteres em apenas 64 caracteres, logo há muitas colisões, tornando o sistema não seguro
O código de Gonçalo é muito fraco, mas uma linha que ele utilizou me chamou atenção
o_hash(buf[]){
new hstr[] = "AQHENA";
new fstr;
new hash = strlen(buf);
new z;
new var;
new n;
for(n = 0; n z = (var + 1246789) * 10;
fstr = z + strlen(hstr);
} return fstr;
}
O código é fraco porque não armazena a posição da letra na cadeia de caracteres, isto é
ABC = CBA = BCA = BAC
Observeram? Ambos retornaram o mesmo hash. Em questão de segundos posso tirar vários hashs que possam retornar o mesmo valor
A = 1
B = 2
C = 3
logo A + B = (A + B) + 1
Isto é, não tem segurança nenhuma, mas voltando ao assunto que me chamou atenção. O (var + 1246789) fará uma espécie de progressão aritmética, pensando nisto, acredito que posso burlar uma lógica com base na posição dos caracteres, tamanho da string, valor do caractere e um valor adicional a cada loop (sequencia aritmética). O mesmo poderia
ABCDE
Pular de 2 em 2 e depois fazer a operação inversa começando do FINAL + 1
Logo pegariamos
A - > C -> E
D -> B
Assim a posição será contada, excluindo a possibilidade de ABC e CBA ter o mesmo valor
Enfim, é isto .. O que acham? Procede? Se puderem dar dicas ou padrões que possa "alargar a representação dos números"
Se utilizar 255 caracteres na expressão final, podemos obter uma combinação enorme e com o sistema de pular caracteres, a taxa de colisão seria muito baixa!
A tempos e tempos procuramos como fazer hashs rápidos e eficientes, mas nunca conseguimos! Basicamente hash é uma especie de codificação que não pode ser voltada atrás. Em grande parte dos casos é feita com a soma dos caracteres mais a representação em letras.
Muitos hashs são famosos, mas poucos são eficientes. Um deles que uso e conheço é MD5, apesar de ser bastante eficiente atualmente, ainda está longe de ser totalmente seguro. Isto porque a taxa de colisões é relativamente grande. Lembrando que taxa de colisões é o número de palavras que tem o mesmo hash. Isto ocorre porque matematicamente é impossível representar milhões de cadeias de caracteres em apenas 64 caracteres, logo há muitas colisões, tornando o sistema não seguro
O código de Gonçalo é muito fraco, mas uma linha que ele utilizou me chamou atenção
o_hash(buf[]){
new hstr[] = "AQHENA";
new fstr;
new hash = strlen(buf);
new z;
new var;
new n;
for(n = 0; n
fstr = z + strlen(hstr);
} return fstr;
}
O código é fraco porque não armazena a posição da letra na cadeia de caracteres, isto é
ABC = CBA = BCA = BAC
Observeram? Ambos retornaram o mesmo hash. Em questão de segundos posso tirar vários hashs que possam retornar o mesmo valor
A = 1
B = 2
C = 3
logo A + B = (A + B) + 1
Isto é, não tem segurança nenhuma, mas voltando ao assunto que me chamou atenção. O (var + 1246789) fará uma espécie de progressão aritmética, pensando nisto, acredito que posso burlar uma lógica com base na posição dos caracteres, tamanho da string, valor do caractere e um valor adicional a cada loop (sequencia aritmética). O mesmo poderia
ABCDE
Pular de 2 em 2 e depois fazer a operação inversa começando do FINAL + 1
Logo pegariamos
A - > C -> E
D -> B
Assim a posição será contada, excluindo a possibilidade de ABC e CBA ter o mesmo valor
Enfim, é isto .. O que acham? Procede? Se puderem dar dicas ou padrões que possa "alargar a representação dos números"
Se utilizar 255 caracteres na expressão final, podemos obter uma combinação enorme e com o sistema de pular caracteres, a taxa de colisão seria muito baixa!