金蝶EAS BOS 生成 ID

package com.henglu.test;

import java.io.ByteArrayOutputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Arrays;

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;

/** 
* 金蝶EAS BOS 创建ID
* @author zhouxianglh@gmail.com
* @version 1.0  2014-4-11 下午9:31:14 
*/
public class CreateID {
    // byte 转 int
    public static int bytesToInt(byte[] b) {
        int v0 = (b[0] & 0xff) << 24;// &0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位
        int v1 = (b[1] & 0xff) << 16;
        int v2 = (b[2] & 0xff) << 8;
        int v3 = (b[3] & 0xff);
        return v0 + v1 + v2 + v3;
    }

    /**
     * 生成BOSuuid,生成规则为 两个随机的 long 型数据,组合后加上 int 型的bostType ,经过Base64 转码生成的
     */
    public static String createID(int bosType) throws IOException {
        // 随机生成的数据不会重复么?
        // 以下代码是从BOS里抽出来的
        SecureRandom random = new SecureRandom();
        byte[] randomBytes = new byte[16];
        random.nextBytes(randomBytes);
        randomBytes[6] = (byte) (randomBytes[6] & 0xF);
        randomBytes[6] = (byte) (randomBytes[6] | 0x40);
        randomBytes[8] = (byte) (randomBytes[8] & 0x3F);
        randomBytes[8] = (byte) (randomBytes[8] | 0x80);
        long mostSigBits = 0L;
        long leastSigBits = 0L;
        for (int i = 0; i < 8; ++i) {
            mostSigBits = mostSigBits << 8 | randomBytes[i] & 0xFF;
        }
        for (int i = 8; i < 16; ++i) {
            leastSigBits = leastSigBits << 8 | randomBytes[i] & 0xFF;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutput out = new DataOutputStream(baos);
        out.writeLong(mostSigBits);
        out.writeLong(leastSigBits);
        out.writeInt(bosType);
        return Base64.encode(baos.toByteArray());
    }

    /**
     * 根据十六进制 bosType 生成ID
     */
    public static String createID(String bosType) throws IOException {
        return createID(getBosTypeInt(bosType));
    }

    /**
     * 把十进制的 bosType 返回十六进制的 bosType,ID 经过base64解码后取最后4位生成int 型数据,转十六进制即可以得到bosType,然后可以通过bosType得到实体名
     */
    public static String getBosType(String id) throws Base64DecodingException {
        byte[] result = Arrays.copyOfRange(Base64.decode(id), 16, 20);
        int type = bytesToInt(result);
        return Integer.toHexString(type).toUpperCase();
    }

    /**
     * 十六进制的 bosType 转十进制的  bosType
     */
    public static int getBosTypeInt(String bosType) {
        return Integer.valueOf(bosType, 16);
    }

    public static void main(String[] args) {
        try {
            String id = createID("2B62B38A");
            System.out.println(id);
            System.out.println(getBosType(id));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Base64DecodingException e) {
            e.printStackTrace();
        }
    }
}

按自己的理解,解释下吧:

通过 SecureRadom 生成16进制随机数,然后转换为long类型,稍处理后再连接int 型的 bosType ,最后Base64 加密.....因为SecureRadom 是伪随机,所以不会重复,而base64 根据不同的内容生成的密文也是不同的,就保证了ID的唯一???


转载于:https://my.oschina.net/zhouxiang/blog/221139

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EAS (Enterprise Administration Server) 是一种企业级的系统管理工具,它提供了强大的功能来生成附件。EAS 是一个基于服务器的应用程序,可以帮助管理员轻松地管理网络中的所有终端设备。 首先,EAS 可以生成附件,这意味着管理员可以使用 EAS创建电子邮件附件。管理员可以选择要在邮件中添加的文件,并使用 EAS 轻松地将文件添加为附件。这对于发送文件给其他用户非常有用,而且可以提高工作效率。 其次,EAS 还可以生成其他类型的附件。例如,管理员可以使用 EAS创建包含配置文件或软件安装程序的附件。这样,管理员可以轻松地将所需的文件发送给终端设备,从而实现远程管理和配置。 另外,EAS 提供了强大的管理功能,使管理员可以轻松地控制附件的访问权限。管理员可以设置谁可以访问附件,以及可以进行的操作,如查看、下载或编辑。这样,管理员可以确保只有授权人员能够访问敏感文件,从而提高数据安全性。 最后,EAS 还提供了自动化生成附件的功能。管理员可以设置规则和条件,以便在特定事件发生时自动创建附件。例如,当某个终端设备满足特定条件时,EAS 可以自动在电子邮件中生成附件,通知管理员进行处理。 总结来说,EAS 是一种非常有用的工具,可以帮助管理员轻松地生成附件。它提供了丰富的功能和管理选项,使管理员能够更好地管理和控制附件,从而提高工作效率和数据安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值