是否有任何算法或 api 可以使用单个输入字符串/模式生成多个唯一 ID,因此如果我们输入任何结果 ID,它应该匹配模式/字符串(即,我们可以根据输入模式/字符串验证结果 ID )
任何想法?
您可以使用不安全的哈希函数。您的“单一模式”可能是一个哈希值。然后,您的多个 ID 可以是在传递给不安全哈希函数时给出该哈希值的任何输入。散列函数需要不安全,以便您可以向后驱动它以生成新的 ID。
例如,您的哈希可能只是将所有字节异或在一起。如果您的单一模式是 0x2A,那么任何与该值异或的字符串都可以是一个 ID。
您需要根据自己的需要判断散列函数的不安全程度。您可以使用许多具有不同程度可逆性的加密不安全哈希函数。
正如上面一个想法的答案是使用哈希表,制作自己的哈希函数,或者简单地使用Object.hashCode()。但是请注意,您必须以某种方式处理冲突。这意味着 id 并不总是唯一的,您必须处理这种情况。如果有多个字符串在输入时获得相同的 id,则内置于hashTable中的 Java 会在比较输入的字符串时处理此问题。
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 作为目标。