我正在制作一个基本的编码算法,它接受输入,编码(使用随机数),然后解密。数组填充类型“char”。它单独加密每个字母。如何在编码字母时检查相同的字母是否未被编码为其他字母。
实施例
编码
ABC
a给出随机数2 b给出随机数5 我怎样才能防止c被给予2或5
非常感谢!
答案 0 :(得分:0)
这是我的主张:
Character yourInput[] = {'a', 'b', 'c', 'd'};
int yourInputEncoded[] = new int[yourInput.length];
Hashtable<Character, Integer> charToInt = new Hashtable<Character, Integer>();
ArrayList<Integer> alreadyUsedInt = new ArrayList<Integer>();
Random randomize = new Random();
for(int i = 0; i < yourInput.length; i++)
{
if(!charToInt.containsKey(yourInput[i]))
{
int randomInt = randomize.nextInt();
while(!alreadyUsedInt.contains(randomInt))
randomInt = randomize.nextInt();
charToInt.put(yourInput[i], randomInt);
alreadyUsedInt.add(randomInt);
}
yourInputEncoded[i] = charToInt.get(yourInput[i]);
}
对于每个char,我们检查是否与int相关联。如果不是,我们生成(随机)一个新的关联int(之前从未使用过)。 之后我们用他的关联int替换char。它:)
答案 1 :(得分:0)
Baz的答案会起作用,但会很慢(相对来说,因为你需要为每个生成的数字搜索集合,但你可能不在乎)。
ChristofferHammarström的答案(产生N个连续数字和随机播放)有效,但缺乏随机性,因为这是加密。
这是一种获取唯一(几乎)随机数数组的算法。
caracterSetCount
大小static final int RANDOM_RANGE = 3000;
randomKeys = new long[caracterSetCount];
randomKeys[0] = rand.nextInt(RANDOM_RANGE); // A number between 0 and RANDOM_RANGE
for (int i=1; i<caracterSetCount; ++i) {
randomKeys[i] = randomKeys[i-1] + 1 + rand.nextInt(RANDOM_RANGE);
We have a pseudo random number which is strictly greater than the previous one
}
然后你有一个数组来为每个要编码的字符获取伪随机数。
为了获得更多随机性,您可以增加RANDOM_RANGE(但请注意不要在不断添加数字时溢出);