【问题标题】:How to generate unique string of length 28 from two unique strings of length 28?如何从两个长度为 28 的唯一字符串生成长度为 28 的唯一字符串?
【发布时间】:2017-01-14 16:09:04
【问题描述】:

我想从两个唯一的字母数字字符串生成长度为 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);
}

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

注意:生成的字符串与父字符串长度一致

感谢任何帮助。谢谢。

【问题讨论】:

  • 你试过什么?
  • 假设,连接(唯一 A,唯一 B)将始终是唯一的字符串文字。
  • 您对输入或输出中允许的字符有限制吗?
  • @Salixalba 只是输入和输出应该是字母数字,我只是担心我的代码会降低结果字符串的唯一性概率,希望你能理解。

标签: java security math random uid


【解决方案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() 方法。

【讨论】:

    【解决方案2】:

    您可以使用 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。

    【讨论】:

    • 感谢您的努力,我会尝试并告诉您
    • 实际上我得到了两个字符串的连接,我需要它与父字符串的长度相同。
    • @Sayak,生成的字符串长度必须为 28
    • @tpk,添加长度为 (28-2)/2 的字符串,并在两个字符串中添加循环计数以获得唯一 ID。
    • 你能解释一下你的声明吗@SayakChoudhury
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多