自制一个简单的数字加密

  • 最近在学习《算法4》。本书的56页,使用一个数值来保存年月日。看到这里我为算法的强大感到惊叹。
public class DateDefination {
    private final int value;
    public DateDefination(int m,int d,int y){
        value = y*512+ m * 32 + d;
    }
    public int month(){
        return (value / 32) % 16;
    }
    public int day(){
        return value % 32;
    }
    public int year(){
        return value / 512;
    }
    public String toString(){
        return month()+"/"+day()+"/"+year();
    }
}
  • 尽管这个表示方法不是特别准确,比如输入(8,32,2019),输出结果 9/0/2019 。但是该算法相较于使用year,month,day变量节省了空间。
  • google这道题时,无意间看到一篇相关的博客。这个算法的核心在于的选取和%,/的运用。
  • 本人自制了一个数字加密的程序,盐值是随机的。
import java.util.Random;
public class IntValue_edge {
    private final int value;
    private int[] arr;
    //权(随机数),需要保存
    private static int sign;
    //计算出原始数值的位数
    private static int count = 1;
    public IntValue_edge(int orgin){
        //传入任意位数数值
        //获取一个随机整数数值(大于10)
        Random random = new Random();
        sign = random.nextInt(10)+10;
        //用于测试10进制的位数
        int divider= 10;
        //对于10以上的数字
        while(orgin / divider != 0){
            count++;
            divider = divider * 10;
        }
        int keep = 0;
        for(int i =0; i < count;i++){
            keep += (((orgin / (int)Math.pow(10,i)) % 10) * (int)Math.pow(sign,i));
        }
        value = keep;
        //计算value = 位上的值 * 权 ^ 第几位 累加
//        value = first * 1000 + second * 100 + third * 10 +four;
    }
    public int getValue(){
        return value;
    }
    public int getSign(){
        return sign;
    }
    /*public int four(){
        return value % 100;
    }
    public int third(){
        return (value / 10) % 10;
    }
    public int second(){
        return (value / 100) % 10;
    }
    public int first(){
        return (value / 1000) % 10;
    }
    public String toString(){
        return first()+""+second()+""+third()+""+four();
    }*/
    public String toString(){

        //保存结果
        String result = "";
        //用于循环递增
        for(int i = 0;i < count ; i++){
            result = ((value /((int)Math.pow(sign,i))) % sign)+"" + result;
        }
        return result;
    }
    public static void main(String[] args){
        IntValue_edge orgin = new IntValue_edge(2015);
        int value = orgin.getValue();
        int sign = orgin.getSign();
        System.out.println("输入的数值为:" + orgin 
        + "\n加密盐值为:" 
        + sign +"\n加密后为:" + value);
    }
}

你可能感兴趣的:(数据结构)