我有员工数据,每位员工都有地址信息。我需要为邮政编码(5个字符)和地址第1行(35个字符)生成唯一的9位(数字或字母数字)值,这是表示位置的唯一值。它也被称为"包裹编号"。
如下图所示,当两名员工的地址相同时,包裹编号应相同,否则应分配新值。
哪种算法最适合生成9位唯一值?
P.S。我需要用Java编程。
答案 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)
。或者您可以使用两个长值getLeastSignificantBits
,getMostSignificantBits
并从中创建一个9位数值。
答案 2 :(得分:0)
一个简单的选择可能就是利用Java内置的散列....
String generateIdentifier(String postCode, String addressLine) {
long hash = ((postCode.hashCode() & 0xffffffffL) << 14L)
^ (addressLine.hashCode() & 0xffffffffL);
return Long.toString(hash, 36);
}