Problema 3 – Algoritmo de impressão digital de texto

Olá Candidato(a), parabéns por teres chegado até aqui!

Isto agora vai tornar-se um pouco mais difícil, mas com alguma pesquisa e esforço, certamente encontrarás a solução. Segue-se então o desafio!

Em grandes quantidades de texto, podem ser feitas alterações subtis que dificilmente sejam identificadas. Sabemos que há alguém que anda a fazer alterações subtis nos nossos documentos, mas ainda não conseguimos identificar nem quais foram os documentos, nem quem os anda a alterar.

Com o objetivo de detetar futuras alterações, fizemos um backup secreto a todos os documentos, e agora queremos proceder à construção de pequenos resumos - tipo “impressão digital” - desses documentos, que, caso os documentos sejam alterados, ao calcular novamente a “impressão digital” dos documentos, iremos obter resumos completamente diferentes.

Estes tipos de algoritmos são conhecidos na informática. Chamam-se funções de hash. O objetivo é implementares a tua função de hash. Não necessitas de seguir as implementações existentes, aliás, são bastante complicadas e não é isso que queremos. Aquilo que queremos é que uses a tua criatividade e imaginação para resolver este problema. Faz o algoritmo à tua maneira!

 

Este algoritmo deve procurar cumprir com as seguintes propriedades:
1. Dois textos iguais devem produzir a mesma impressão digital.

2. Dois textos diferentes devem produzir impressões digitais diferentes.

3. Dois textos diferentes, mas muito parecidos, devem também produzir impressões digitais diferentes e que não exibam maiores semelhanças que impressões digitais de textos completamente diferentes.

4. As impressões digitais devem ser sempre constituídas por 32 caracteres, independentemente da dimensão do texto.

5. Cada caracter deve ser uma letra do alfabeto de “a” a “z”.

 

A função a implementar deve receber como parâmetro de entrada uma string com o texto do qual será criada a impressão digital, e deve retornar a impressão digital do texto.

 

A função deve ter a seguinte estrutura:

function calculateHash(text) {…}

 

Seguem-se vários exemplos:

var hash1 = calculateHash(‘a’); //produz o resultado fuaxejmvcimfmpacvaqubnsuzszaltmx

var hash2 = calculateHash(‘a’); //produz o mesmo resultado fuaxejmvcimfmpacvaqubnsuzszaltmx

var hash3 = calculateHash(‘b’); //produz o resultado hecwibpnjfdccnkfxmqefgtigprzapos 

var hash4 = calculateHash(‘The quick brown fox jumps over the lazy dog’); //produz o resultado qidqzcoqfmezzqunmnvajkyarupikiwz

var hash5 = calculateHash('Finished her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask. Nay projecting unpleasing boisterous eat discovered solicitude. Own six moments produce elderly pasture far arrival. Hold our year they ten upon. Gentleman contained so intention sweetness in on resolving.'); //produz o resultado rwximlxysjnrmhnhkcqrzchyzlxmvtln

 

Atenção: a tua função não tem que produzir os mesmos resultados que nos exemplos. O objetivo é que produza resultados que cumpram com as cinco propriedades enumeradas!

Dica: sabias que cada caracter corresponde a um número? Pesquisa por ASCII table!

Dica2: existe um operador parecido com o operador de divisão ('/'), que permite obter o resto da divisão inteira. Esse operador tem o sinal da percentagem ('%'). Se o teu alfabeto tem 26 letras, consegues converter qualquer número num número entre 0 e 25 através da operação:

var value = num%26;