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

时间:2016-09-07 05:37:52

标签: 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(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);
}

在上面的代码中,我不确定结果字符串是否与其父字符串一样强大。

注意:生成的字符串与父字符串的长度相同

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

鉴于碰撞是不可避免的。我们可以看一下像哈希码生成这样的想法。在哈希表中,您希望为每个对象生成哈希码。理想情况下,您需要一个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()方法。

答案 1 :(得分:0)

您可以使用StringBuilder / StringBuffer添加两个字符串uid(28位字母数字),并将连接的字符串放入Set的任何实现中。如果有的话,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。