在Java中可逆地随机排列一个整数数组

4
我有一个相当大的整数数组。我需要使用密钥完全打乱数组。我应该能够使用相同的密钥获取原始数组。我搜索了任何洗牌算法,但我发现像 Fisher Yates 这样的算法不使用密钥。
整数数组是图像的像素值。我需要将数据隐藏在其中。所以在打乱数组后隐藏数据只能通过拥有密钥来访问。

2
你可以使用费舍尔-耶茨算法实现洗牌,详见 https://dev59.com/inA65IYBdhLWcg3w9DqF#3542000 -- 顺便说一句,这是在谷歌搜索“可逆洗牌”关键词的结果中排名第一。 - NPE
1个回答

2

Fisher-Yates算法使用伪随机数生成器,您可以使用密钥进行种子化(查找加密PRNGs)。要反转该过程,请使用相同的密钥对索引数组[0,n)进行洗牌,然后执行反向洗牌。


1
这是我想出来的代码:`for (int i=0; i < data.length; i++) { j = (j + key[i % key.length]) % data.length; tmp = data[i]; data[i] = data[j]; data[j] = tmp; }` 它可以打乱数组,但无法恢复原始顺序。 - Amar C
请问您能否回复一下。 - Amar C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接