암호화 모듈 함부로 공개할 수 없다.
・임의의 메세지(a)→해시함수 f(x) → (ac7b6ac~~~~)고정길이, 단방향성(복호화가 안된다.)
복호화 :ac7b6ac~~~를 a로 다시 바꾸는 것.
복호화되는 것과 안 되는 것이 있다.
public native int hashCode();
⇒구현부가 없다.
⇒알고리즘을 함부로 공개할 수 없기 때문에 native로 C++로 만들어진 hashCode() 알고리즘을 끌고온다.
진짜 주소값(new Test()) → hashCode 알고리즘 → 가짜 주소값을 반환한다.
1.32bit고정값(복호화불가)
2.64bit를 32bit로 변환하기 위해 사용
[계산] package CollectionF; import java.util.*; class Num2 { int num; public Num2(int num) { this.num = num; } @Override public int hashCode() { return num % 2; } public boolean equals(Object obj) { if (num == ((Num2) obj).num) { return true; } else { return false; } } public String toString() { return String.valueOf(num); } } public class Test9 { public static void main(String[] args) { HashSet<Num2> set = new HashSet<>(); set.add(new Num2(7799)); set.add(new Num2(9955)); set.add(new Num2(7799)); System.out.println("인스턴스 수: " + set.size()); for (Num2 n : set) System.out.print(n.toString() + '\t'); System.out.println(); } }
[결과값] 인스턴스 수: 2 7799 9955
[계산] package CollectionF; import java.util.*; class Person1 { String name; int age; public Person1(String name, int age) { this.age = age; this.name = name; } public int hashCode() { return age % 3; } public boolean equals(Object obj) { if (name.equals(((Person1) obj).name) && (age == (((Person1) obj).age))) { return true; } else { return false; } } public String toString() { return name + "(" + age + "세)"; } } public class Test9 { public static void main(String[] args) { HashSet<Person1> hSet = new HashSet<Person1>(); hSet.add(new Person1("LEE", 10)); hSet.add(new Person1("LEE", 10)); hSet.add(new Person1("PARK", 35)); hSet.add(new Person1("PARK", 35)); System.out.println("저장된 데이터 수: " + hSet.size()); System.out.println(hSet); } }
[결과값] 저장된 데이터 수: 2 [LEE(10세), PARK(35세)]
[계산] package CollectionF; import java.util.*; public class Test10 { public static void main(String[] args) { Set<Integer> lotto = new HashSet<>(); // Integer 안에 동일 숫자가 오면 튕겨내도록 equals와 hashcode를 만들어놨다. while (lotto.size() < 6) { lotto.add((int) (Math.random() * 45) + 1); } System.out.print("로또번호: "); for (Iterator<Integer> i = lotto.iterator(); i.hasNext();) { System.out.print(i.next() + " "); } } } ------------------------------------------------------------------------ package CollectionF; import java.util.*; public class Test10 { public static void main(String[] args) { Set<Integer> lotto = new HashSet<>(); // Integer 안에 동일 숫자가 오면 튕겨내도록 equals와 hashcode를 만들어놨다. while (lotto.size() < 6) { int random = (int) (Math.random() * 45) + 1; lotto.add(random); }System.out.print("로또번호: "); System.out.println(lotto); } }
[결과값] 로또번호: 3 38 6 39 9 27 ----------------------------------- 로또번호: [32, 35, 20, 21, 24, 12]
Set : 중복x 순서x
List : 중복o 순서o
Map : 중복x 순서o
[계산 : HashMap] package CollectionF; import java.util.*; public class HashMapTest { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); // Key-Value 기반 데이터 저장 map.put(45, "Brown"); // Key값은 set으로 설정되어 있다. map.put(37, "James"); map.put(23, "Martin"); // map.put(23, "홍길동"); // Martin이 사라지고 홍길동이 나온다. Key값이 중복되면 안 되기 때문! // 데이터 탐색 System.out.println("23번: " + map.get(23)); System.out.println("37번: " + map.get(37)); System.out.println("45번: " + map.get(45)); System.out.println(); // 데이터 삭제 // map.remove(37); // 데이터 삭제 확인 System.out.println("37번: " + map.get(37)); // ================================================================ // Key만 담고 있는 컬렉션 인스턴스 생성 | map을 순차적으로 돌릴 때 Set<Integer> ks = map.keySet(); // 전체 Key 출력(for-each문 기반) for (Integer n : ks) System.out.print(n.toString() + '\t'); System.out.println(); // 전체 Value 출력(for-each문 기반) for (Integer n : ks) System.out.print(map.get(n).toString() + '\t'); // 전체 Value 출력(반복자 기반) for (Iterator<Integer> itr = ks.iterator(); itr.hasNext();) System.out.print(map.get(itr.next()) + '\t'); System.out.println(); } }
[결과값] 23번: Martin 37번: James 45번: Brown 37번: James 37 23 45 James Martin Brown James Martin Brown
[계산 : TreeMap] package CollectionF; import java.util.*; public class HashMapTest { public static void main(String[] args) { Map<Integer, String> map = new TreeMap<>(); // Key-Value 기반 데이터 저장 map.put(45, "Brown"); // Key값은 set으로 설정되어 있다. map.put(37, "James"); map.put(23, "Martin"); // map.put(23, "홍길동"); // Martin이 사라지고 홍길동이 나온다. Key값이 중복되면 안 되기 때문! // 데이터 탐색 System.out.println("23번: " + map.get(23)); System.out.println("37번: " + map.get(37)); System.out.println("45번: " + map.get(45)); System.out.println(); // 데이터 삭제 // map.remove(37); // 데이터 삭제 확인 System.out.println("37번: " + map.get(37)); // ================================================================ // Key만 담고 있는 컬렉션 인스턴스 생성 | map을 순차적으로 돌릴 때 Set<Integer> ks = map.keySet(); // 전체 Key 출력(for-each문 기반) for (Integer n : ks) System.out.print(n.toString() + '\t'); System.out.println(); // 전체 Value 출력(for-each문 기반) for (Integer n : ks) System.out.print(map.get(n).toString() + '\t'); // 전체 Value 출력(반복자 기반) for (Iterator<Integer> itr = ks.iterator(); itr.hasNext();) System.out.print(map.get(itr.next()) + '\t'); System.out.println(); } }
[결과값] 23번: Martin 37번: James 45번: Brown 37번: James 23 37 45 Martin James Brown Martin James Brown