Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从两个长度为28的唯一字符串生成长度为28的唯一字符串?_Java_Security_Math_Random_Uid - Fatal编程技术网

Java 如何从两个长度为28的唯一字符串生成长度为28的唯一字符串?

Java 如何从两个长度为28的唯一字符串生成长度为28的唯一字符串?,java,security,math,random,uid,Java,Security,Math,Random,Uid,我想从两个唯一的字母数字字符串生成长度为28的唯一字母数字字符串。从数学上讲,有可能从两个唯一的字符串中获得无冲突的字符串吗 以下是我所做的 ASCII_NUMBER_RANGE_START = 48; ASCII_ALPHABET_RANGE_START =55; for (int i = 0; i < firstArray.length; i++) { int tempASCIIValue = (Character.getNumericValue(firstArra

我想从两个唯一的字母数字字符串生成长度为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);
}
ASCII\u编号\u范围\u开始=48;
ASCII字母表范围开始=55;
for(int i=0;i如果(tempascivalue,您可以使用StringBuilder/StringBuffer添加两个字符串UID(28位字母数字),并将包含的字符串放入的任何实现中。设置的实现将过滤掉重复的元素(如果有)

以下是示例代码:

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);
        }
    }
}

您可以添加循环变量来创建唯一id。

因为冲突不可避免。我们可以看看哈希代码生成之类的想法。在哈希表中,您希望为每个对象生成哈希代码。理想情况下,您需要一个唯一的id,但这很难实现

您可能可以使用哈希函数,例如,请参见

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()
方法对每对整数执行。

您尝试了什么?比方说,串联(唯一A、唯一B)将始终是唯一的字符串文字。请尝试此链接-您对输入或输出中允许的字符有限制吗?@Salixalba仅输入和输出应为字母数字,我只是担心我的代码会降低结果字符串唯一性的概率,希望您理解。感谢您的努力,我将尝试把它拿出来,让你知道实际上我得到了两个字符串的浓缩,我需要它的长度与父字符串的长度相同。@Sayak,生成的字符串的长度必须为28@tpk,添加字符串(28-2)/2长度,并在两个字符串中添加循环计数以获得唯一id。能否请您在@SayakChoudhury语句中解释更多内容
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;
}