무작위 키와 값의 매핑을 셔플을위한 또 다른 방법 :
public static <K,V> void shuffleMap(Map<K,V> map) {
List<V> valueList = new ArrayList<V>(map.values());
Collections.shuffle(valueList);
Iterator<V> valueIt = valueList.iterator();
for(Map.Entry<K,V> e : map.entrySet()) {
e.setValue(valueIt.next());
}
}
편집 :
당신이 (당신이 나중에 그것을 필요로하기 때문에) 원래 맵을 변경하지 않으려면
, 당신은 정말 seemingl을 원하지 않는 public static <K,V> Map<K,V> shuffleMap(Map<K,V> map) {
List<V> valueList = new ArrayList<V>(map.values());
Collections.shuffle(valueList);
Iterator<V> valueIt = valueList.iterator();
Map<K,V> newMap = new HashMap<K,V>(map.size());
for(K key : map.keySet()) {
newMap.put(key, valueIt.next());
}
return newMap;
}
: 대신 새로 만들 수 있습니다 y- 무작위로 섞어서 되돌릴 수 있습니다. (바로 복잡 해짐)하지만 원본지도 만 유지하면됩니다. 이것이 맞지 않으면 문제를 더 잘 설명해야합니다.
좋습니다. 다른 매핑을 제공하고 다시 암호 해독하여 비밀 키를 사용하여 매핑을 암호화하려고합니다. 분명히 랜덤 셔플 링은 여기서 도움이되지 않으며 의사 랜덤 화도 신뢰할 수있는 방법을 제공하지 않기 때문에 좋지 않습니다. 기본 경우에, 당신의 키는 맵핑의 키 사이의 역전력 맵이 될 것입니다.
암호 해독은 실제로 키의 역방향 맵을 사용하여 동일하게 작동합니다.
예제 키가 {100, 200, 300}
인 경우 이러한 키의 순열은 "암호화 체계"의 유효한 키입니다. 는 (매우 안전하지 만 6 가능한 사람이 있습니다.)
Map sampleKey = new HashMap<Integer, Integer>();
sampleKey.put(100, 200);
sampleKey.put(200, 300);
sampleKey.put(300, 100);
Map sampleUnKey = new HashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> e : sampleKey) {
sampleUnKey.put(e.getValue(), e.getKey());
}
Map<Integer, String> data = new HashMap<Integer, String>();
data.put(100, "white");
data.put(200, "black");
data.put(300, "red");
System.out.println(data);
Map<Integer, String> encrypted = encryptMap(data, sampleKey);
System.out.println(encrypted);
Map<Integer, String> decrypted = encryptMap(data, sampleUnKey);
System.out.println(decrypted);
지도 decrypted
이제 원래의 맵과 동일해야합니다.
더 큰 키 집합의 경우 입력 가능한 키에서 키의 순열을 얻는 방법을 찾고 싶을 것입니다.
"믹싱 업"이란 무엇을 의미합니까? – marcog
수행하려는 알고리즘을 모를 경우 어떤 데이터 구조가 가장 적합한 지 알 수 없습니다. –
@Max 모든 키는 고유합니까? – Marnix