Java生成MyEclipse8.6+序列号代码

import java.io.Serializable;

/**
 * MyEclipse6.5注册码_8.5注册码_8.6注册码,为在线注册版,因为考虑到网络访问io流的问题,让类MyEclipseGen实现 java.io.Serializable 接口 ;
 * 大部分代码来自网络,能不改,就不改;拿来,然后用,一直都是程序员的优秀品质;
 */
public class MyEclipseGen implements Serializable {
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		String key = "haha";
		System.out.println(key);
		System.out.println(getCode(key));
	}

	private static final long serialVersionUID = 7684560663783083527L; // 加上serialVersionUID属性是为了保持JDK版本的兼容性,可不加,不知道理解的对不对;

	private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";

	public MyEclipseGen() { // 空构造器原则上必须加
		super();
	}

	/**
	 * 具体的Subscription Code生成算法
	 * 
	 * @param userId
	 *            用户名
	 * @param licenseNum
	 *            这个可能是由MyEclipse的版本号决定的,我只见过"1"和"5"的情况;此程序选择的"5",支持MyEclipse6.5, 8.5,8.6版本;
	 * @return 用户名所对应注册码
	 */
	public String getSerial(String userId, String licenseNum) {
		java.util.Calendar cal = java.util.Calendar.getInstance(); // 获得当前日期
		cal.add(1, 3); // +3年
		cal.add(6, -1); // 当前日-1
		java.text.NumberFormat nf = new java.text.DecimalFormat("000");
		licenseNum = nf.format(Integer.valueOf(licenseNum)); // licenseNum格式化成三位数字
		String verTime = new StringBuilder("-").append(new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").toString(); // 日期
		String type = "YE3MP-";
		String need = new StringBuilder(userId.substring(0, 1)).append(type).append("300").append(licenseNum).append(verTime).toString(); // 初步注册信息
		String dx = new StringBuilder(need).append(LL).append(userId).toString();
		int suf = this.decode(dx); // 编码初步注册信息
		String code = new StringBuilder(need).append(String.valueOf(suf)).toString();
		return this.change(code);
	}

	/**
	 * 算法的一部分,看不懂,索性无视它。
	 * 
	 * @param s
	 * @return
	 */
	private int decode(String s) {
		int i;
		char[] ac;
		int j;
		int k;
		i = 0;
		ac = s.toCharArray(); // 把s转化为单个字符数组
		j = 0;
		k = ac.length;
		while (j < k) {
			i = (31 * i) + ac[j]; // 加密算法,不理解为什么这样子?有可能就是这样子定义的
			j++;
		}
		return Math.abs(i); // 取绝对值
	}

	/**
	 * 变化原则是 把数字(10个)或者字母表(大小写各26个)折半对调(两个相互改变),也即 0与5对调(0变5,5变0) A与N,a与n对调
	 * 
	 * @param s
	 *            原字符串
	 * @return 变化后的字符串
	 */
	private String change(String s) {
		byte[] abyte0;
		char[] ac;
		int i;
		int k;
		int j;
		abyte0 = s.getBytes();
		ac = new char[s.length()];
		i = 0;
		k = abyte0.length;
		while (i < k) {
			j = abyte0[i];
			if ((j >= 48) && (j <= 57)) { // 0-9,实现01234和56789相应的相互对调,也即0与5对调,1与6对调
				j = (((j - 48) + 5) % 10) + 48;
			} else if ((j >= 65) && (j <= 90)) { // A-Z
				j = (((j - 65) + 13) % 26) + 65;
			} else if ((j >= 97) && (j <= 122)) { // a-z
				j = (((j - 97) + 13) % 26) + 97;
			}
			ac[i] = (char) j;
			i++;
		}
		return String.valueOf(ac);
	}

	/**
	 * 增加这个方法是为了方便servlet(web.ActionServlet)调用
	 * 
	 * @param subscriber
	 *            用户名
	 * @return subscription_Code 用户名所对应的注册码;
	 */
	public static String getCode(String subscriber) {
		MyEclipseGen myeclipsegen = new MyEclipseGen();
		String subscription_Code = myeclipsegen.getSerial(subscriber, "5"); // 后面的参数是一个数字类型的字符串,数字范围为0-999
		return subscription_Code;
	}

}


MyEclipse8.6+序列号生成代码。先贴着。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public synchronized String nextId() { long timestamp = timeGen(); //获取当前毫秒数 //如果服务器时间有问题(时钟后退) 报错。 if (timestamp < lastTimestamp) { throw new RuntimeException(String.format( "Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } //如果上次生成时间和当前时间相同,在同一毫秒内 if (lastTimestamp == timestamp) { //sequence自增,因为sequence只有12bit,所以和sequenceMask相与一下,去掉高位 sequence = (sequence + 1) & sequenceMask; //判断是否溢出,也就是每毫秒内超过4095,当为4096时,与sequenceMask相与,sequence就等于0 if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); //自旋等待到下一毫秒 } } else { sequence = 0L; //如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加 } lastTimestamp = timestamp; long suffix = (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; String datePrefix = DateFormatUtils.format(timestamp, "yyyyMMddHHMMssSSS"); return datePrefix + suffix; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } private byte getLastIP(){ byte lastip = 0; try{ InetAddress ip = InetAddress.getLocalHost(); byte[] ipByte = ip.getAddress(); lastip = ipByte[ipByte.length - 1]; } catch (UnknownHostException e) { e.printStackTrace(); } return lastip; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值