Codificação* personalizada de inteiros longos

Personalizar os IDs usados em suas páginas pelos caracteres do nome da sua empresa.
Ex:
EMPRESA: XYZ

Antes…

[code]--------------------
CRUD VEICULOS

ID | CARRO
1 | Fusca
2 | Chevet
3 | Brásilia
4 | Monza
5 | D20
6 | D10
7 | C20
8 | C10
9 | Uno
10 | Celta

[/code]
Depois…

[code]--------------------
CRUD VEICULOS

ID | CARRO
y | Fusca
z | Chevet
yx | Brásilia
yy | Monza
yz | D20
zx | D10
zy | C20
zz | C10
yxx | Uno
yxy | Celta

[/code]

Classe necessária

[code]/**

  • Codificação personalizada de inteiros longos
  • @version 1.01 @date 14/12/2012
  • @author Marcelo Junior
    */
    package meupacote;

import java.util.Arrays;

public class Codificacao {
private String[] personalizados;
private String[] padraoJava;

public Codificacao(String... caracteresPersonalizados) {
	personalizados = caracteresPersonalizadosReduzidos(caracteresPersonalizados);
	int tamanho = personalizados.length;
	padraoJava = new String[tamanho];
	int bytes = tamanho;
	for (int i = 0; i < tamanho; i++) {
		padraoJava[i] = Long.toString(i, bytes);
	}
}

public String codifica(Long numero) {
	int bytes = padraoJava.length;
	String codigo = Long.toString(numero, bytes);
	int tamanho = bytes;
	for (int i = 0; i < tamanho; i++) {
		codigo = codigo.replaceAll(padraoJava[i], personalizados[i]);
	}
	return codigo;
}

public Long descodifica(String codigo) {
	codigo = codigo.toLowerCase();
	validaCodigo(codigo);
	int tamanho = personalizados.length;
	int bytes = tamanho;
	for (int i = 0; i < tamanho; i++) {
		codigo = codigo.replaceAll(personalizados[i], padraoJava[i]);
	}
	return Long.valueOf(codigo, bytes);
}

private String[] caracteresPersonalizadosReduzidos(
		String[] caracteresPersonalizados) {
	StringBuffer codigo = new StringBuffer();
	for (String caractere : caracteresPersonalizados) {
		codigo.append(caractere.toLowerCase());
	}
	return codidoReduzido(codigo.toString());
}

private String[] codidoReduzido(String codigo) {
	String[] reduzido = new String[codigo.length()];
	int quantidade = 0;
	while (!codigo.isEmpty()) {
		String caractere = codigo.charAt(0) + "";
		codigo = codigo.replaceAll(caractere, "");
		reduzido[quantidade++] = caractere;
	}
	return Arrays.copyOfRange(reduzido, 0, quantidade);
}

private void validaCodigo(String codigo) {
	String[] reduzido = codidoReduzido(codigo);
	int quantidade = reduzido.length;
	int tamanho = personalizados.length;
	for (int i = 0; i < quantidade; i++) {
		int invalido = i;
		for (int j = 0; j < tamanho; j++) {
			if (reduzido[i].equals(personalizados[j])) {
				invalido = -1;
				break;
			}
		}
		if (invalido != -1) {
			throw new NumberFormatException(
					String.format(
							"caracter inválido: [%s]. Os caracteres válidos são: %s",
							reduzido[invalido], toString()));
		}
	}
}

@Override
public String toString() {
	return Arrays.toString(personalizados);
}

public static void main(String[] args) {
	Codificacao codificacao = new Codificacao("E", "m", "p", "r", "e",
			"s", "a");
	Long numero = 1234567890L;
	System.out.println(numero);
	String codigo = codificacao.codifica(numero);
	System.out.println(codigo);
	numero = codificacao.descodifica(codigo);
	System.out.println(numero);
	codigo = codigo + "x";
	System.out.println(codigo);
	numero = codificacao.descodifica(codigo);
}

}[/code]

Ué, não entendi qual a finalidade dessa criptografia. Você fez por lazer?

Vamos começar do começo: nem criptografia isso é.

http://unknownantisec.wordpress.com/2011/10/03/a-diferenca-entre-codificacao-e-criptografia/

[]'s

basicamente sim. Tirando o besteirou sobre IDs, este algoritmo poderia ser usado para codificar numeros de documentos antes de armazena-los no banco de dados. Usando caracteres q so vc conheceria :thumbup:

[quote]Vamos começar do começo: nem criptografia isso é.

http://unknownantisec.wordpress.com/2011/10/03/a-d...re-codificacao-e-criptografia/[/quote]
Codificação: O objetivo não é manter em segredo as informações, mas sim garantir que o sistema interprete de outra forma os dados contidos na menssagem.
Criptografia: O objetivo é manter uma ?menssagem? em segredo e garantir que os dados não podem ser usados por qualquer pessoa que não seja o destinatário com a chave para a reverter a criptografia.
Dessa diferença eu não sabia, vlw fera!