如何从两个长度为 28 的唯一字符串生成长度为 28 的唯一字符串?
How to generate unique string of length 28 from two unique strings of length 28?
我想从两个唯一的字母数字字符串生成长度为 28 的唯一字母数字字符串。在数学上是否可能从两个唯一字符串中获得无冲突字符串?
这是我做的,
ASCII_NUMBER_RANGE_START = 48;
ASCII_ALPHABET_RANGE_START =55;
for (int i = 0; i < firstArray.length; i++) {
int tempASCIIValue = (Character.getNumericValue(firstArray[i]) + Character.getNumericValue(secondArray[i])) % 35;
if (tempASCIIValue <= 9) {
FINAL_ASCII_VALUE = tempASCIIValue + ASCII_NUMBER_RANGE_START;
} else {
FINAL_ASCII_VALUE = tempASCIIValue + ASCII_ALPHABET_RANGE_START;
}
combinedArray[i] = (char) FINAL_ASCII_VALUE;
}
return new String(combinedArray);
}
在上面的代码中,我不确定生成的字符串是否与其父字符串一样强大。
注意:生成的字符串与父字符串长度相同
感谢任何帮助。谢谢
您可以使用 StringBuilder/StringBuffer 添加您的两个字符串 uid(28 位字母数字)并将连接的字符串放入 Set 的任何实现中。集合实现将过滤掉重复的元素(如果有) .
这里是示例代码:
import java.util.LinkedHashSet;
public class Delete1 {
public static void main(String[] args) {
LinkedHashSet<String> impl=new LinkedHashSet<String>();
for (int i = 0; i < 5; i++) {
String uid1="qwertyuiop1234567890~!@#$%^&";
String uid2="qwertyuiop1234567890~!@#$%^&";
StringBuilder builder=new StringBuilder();
builder.append(uid1);
builder.append(uid2);
impl.add(builder.toString());
}
for (String value : impl) {
System.out.println(value);
}
}
}
虽然循环迭代了 5 次但是输出是
qwertyuiop1234567890~!@#$%^&qwertyuiop1234567890~!@#$%^&
您可以添加循环变量来创建唯一 ID。
鉴于碰撞是不可避免的。我们可以看看像哈希码生成这样的想法。在哈希表中,您想为每个对象生成一个哈希码。理想情况下,您需要 Perfect hash function,但实现起来非常棘手。
您也许可以使用散列函数,例如 Best implementation for hashCode method。一个带有两个整数变量的简单变量是
int generateHashCode(int a,int b) {
// Start with a non-zero constant. Prime is preferred
int result = 17;
// For each field multiply the previous result by a prime and add
result = 31 * result + a;
result = 31 * result + b;
return result;
}
对于您的实施,您可以更改它以使用角色。如果您很高兴失去一个角色,则为每个角色提供 26 + 26 + 9 = 64 种可能性。这意味着您可以为每个字符使用 6 位,为整个输入使用 168 位,这可以放入 6 个整数。然后只是 运行 每对整数上的 generateHashCode()
方法。
我想从两个唯一的字母数字字符串生成长度为 28 的唯一字母数字字符串。在数学上是否可能从两个唯一字符串中获得无冲突字符串?
这是我做的,
ASCII_NUMBER_RANGE_START = 48;
ASCII_ALPHABET_RANGE_START =55;
for (int i = 0; i < firstArray.length; i++) {
int tempASCIIValue = (Character.getNumericValue(firstArray[i]) + Character.getNumericValue(secondArray[i])) % 35;
if (tempASCIIValue <= 9) {
FINAL_ASCII_VALUE = tempASCIIValue + ASCII_NUMBER_RANGE_START;
} else {
FINAL_ASCII_VALUE = tempASCIIValue + ASCII_ALPHABET_RANGE_START;
}
combinedArray[i] = (char) FINAL_ASCII_VALUE;
}
return new String(combinedArray);
}
在上面的代码中,我不确定生成的字符串是否与其父字符串一样强大。
注意:生成的字符串与父字符串长度相同
感谢任何帮助。谢谢
您可以使用 StringBuilder/StringBuffer 添加您的两个字符串 uid(28 位字母数字)并将连接的字符串放入 Set 的任何实现中。集合实现将过滤掉重复的元素(如果有) .
这里是示例代码:
import java.util.LinkedHashSet;
public class Delete1 {
public static void main(String[] args) {
LinkedHashSet<String> impl=new LinkedHashSet<String>();
for (int i = 0; i < 5; i++) {
String uid1="qwertyuiop1234567890~!@#$%^&";
String uid2="qwertyuiop1234567890~!@#$%^&";
StringBuilder builder=new StringBuilder();
builder.append(uid1);
builder.append(uid2);
impl.add(builder.toString());
}
for (String value : impl) {
System.out.println(value);
}
}
}
虽然循环迭代了 5 次但是输出是
qwertyuiop1234567890~!@#$%^&qwertyuiop1234567890~!@#$%^&
您可以添加循环变量来创建唯一 ID。
鉴于碰撞是不可避免的。我们可以看看像哈希码生成这样的想法。在哈希表中,您想为每个对象生成一个哈希码。理想情况下,您需要 Perfect hash function,但实现起来非常棘手。
您也许可以使用散列函数,例如 Best implementation for hashCode method。一个带有两个整数变量的简单变量是
int generateHashCode(int a,int b) {
// Start with a non-zero constant. Prime is preferred
int result = 17;
// For each field multiply the previous result by a prime and add
result = 31 * result + a;
result = 31 * result + b;
return result;
}
对于您的实施,您可以更改它以使用角色。如果您很高兴失去一个角色,则为每个角色提供 26 + 26 + 9 = 64 种可能性。这意味着您可以为每个字符使用 6 位,为整个输入使用 168 位,这可以放入 6 个整数。然后只是 运行 每对整数上的 generateHashCode()
方法。