0

是否有任何算法或 api 可以使用单个输入字符串/模式生成多个唯一 ID,因此如果我们输入任何结果 ID,它应该匹配模式/字符串(即,我们可以根据输入模式/字符串验证结果 ID )

任何想法?

4

3 回答 3

1

您可以使用不安全的哈希函数。您的“单一模式”可能是一个哈希值。然后,您的多个 ID 可以是在传递给不安全哈希函数时给出该哈希值的任何输入。散列函数需要不安全,以便您可以向后驱动它以生成新的 ID。

例如,您的哈希可能只是将所有字节异或在一起。如果您的单一模式是 0x2A,那么任何与该值异或的字符串都可以是一个 ID。

您需要根据自己的需要判断散列函数的不安全程度。您可以使用许多具有不同程度可逆性的加密不安全哈希函数。

于 2013-07-11T12:19:45.783 回答
0

正如上面一个想法的答案是使用哈希表,制作自己的哈希函数,或者简单地使用Object.hashCode()。但是请注意,您必须以某种方式处理冲突。这意味着 id 并不总是唯一的,您必须处理这种情况。如果有多个字符串在输入时获得相同的 id,则内置于hashTable中的 Java 会在比较输入的字符串时处理此问题。

于 2013-07-11T12:23:44.767 回答
0
 static void saveTable(UUID h1, Object x,Hashtable ht)
 {
     if(ht.get(h1) == null)
     {
         ht.put(h1, x);
     }
     else
     {
         Object ref=h1;
         Object ref2=new Object();
         while(ref!=null)
         { 
             if(ref!=null)
             {
                 ref2=ref;
             }
             ref=ht.get(ref);
         }
         ht.put(ref2,x);
     }
 }

 static ArrayList loadTable(UUID h1,Hashtable ht)
 {
     Object x=ht.get(h1);
     Object ref=h1;
     ArrayList al=new ArrayList();
     if(ht.get(h1)!=null)
     {
         while(ref!=null)
         {
             if(ref!=h1)al.add(ref);
             ref=ht.get(ref);
         }

     }
    return al;
 }

然后主要:

public static void main(String[] args)
{
    Hashtable ht=new Hashtable();
    UUID h1=UUID.randomUUID();
    UUID h2=UUID.randomUUID();

    saveTable(h1, "this is",ht);
    saveTable(h1, "inefficient",ht);

    saveTable(h2, "but",ht);
    saveTable(h2, "saves",ht);
    saveTable(h2, "the day",ht);
    saveTable(h2, "at least",ht);

    Object[] al=loadTable(h1,ht).toArray();
    Object[] al2=loadTable(h2,ht).toArray();

    for(int i=0;i<al.length;i++)
    {System.out.println(al[i]);}

    for(int i=0;i<al2.length;i++)
    {System.out.println(al2[i]);}
}

输出:

this is
inefficient
but
saves
the day
at least

当然,我使用字符串作为目标,使用 UUID 作为键。您可以使用 alter 方法接受字符串作为键和 UUID 作为目标。

于 2013-07-11T12:10:05.957 回答