从字符串

时间:2017-10-31 10:24:09

标签: java algorithm unique uniqueidentifier

我有员工数据,每位员工都有地址信息。我需要为邮政编码(5个字符)和地址第1行(35个字符)生成唯一的9位(数字或字母数字)值,这是表示位置的唯一值。它也被称为"包裹编号"。

如下图所示,当两名员工的地址相同时,包裹编号应相同,否则应分配新值。

哪种算法最适合生成9位唯一值?

P.S。我需要用Java编程。

enter image description here

3 个答案:

答案 0 :(得分:1)

简单的想法是使用已经用Java实现的众所周知的哈希算法。

private static long generateIdentifier(final String adrLine, final String postCode) {
    final String resultInput = adrLine + postCode;

    //do not forget about charset you want to work with
    final byte[] inputBytes = resultInput.getBytes(Charset.defaultCharset());
    byte[] outputBytes = null;

    try {
        //feel free to choose the encoding base like MD5, SHA-1, SHA-256
        final MessageDigest digest = MessageDigest.getInstance("SHA-256");
        outputBytes = digest.digest(inputBytes);
    } catch (NoSuchAlgorithmException e) {
        //do whatever you want, better throw some exception with error message
    }

    long digitResult = -1;
    if (outputBytes != null) {
        digitResult = Long.parseLong(convertByteArrayToHexString(outputBytes).substring(0, 7), 16);
    }

    return digitResult;
}

//this method also may be useful for you if you decide to use the full result
// or you need the appropriate hex representation
private static String convertByteArrayToHexString(byte[] arrayBytes) {
    final StringBuilder stringBuffer = new StringBuilder();
    for (byte arrByte: arrayBytes) {
        stringBuffer.append(Integer.toString((arrByte & 0xff) + 0x100, 16)
                .substring(1));
    }
    return stringBuffer.toString();
}

我建议您不要使用MD5和SHA1,因为这些哈希函数可以提供冲突。

答案 1 :(得分:0)

我的想法是:

String str = addressLine + postalCode;
UUID uid = UUID.nameUUIDFromBytes(str.getBytes());
return makeItNineDigits(uid);

makeItNineDigits根据您的喜好减少UUID字符串表示。 :) 这可能是uid.ToString().substring(0, 9)。或者您可以使用两个长值getLeastSignificantBitsgetMostSignificantBits并从中创建一个9位数值。

答案 2 :(得分:0)

一个简单的选择可能就是利用Java内置的散列....

String generateIdentifier(String postCode, String addressLine) {
  long hash = ((postCode.hashCode() & 0xffffffffL) << 14L) 
          ^ (addressLine.hashCode() & 0xffffffffL); 
  return Long.toString(hash, 36);
}