43일차 java 연산(2023-02-22)

권단비·2023년 2월 22일
0

IT

목록 보기
81/139

[hash 함수]

암호화 모듈 함부로 공개할 수 없다.
・임의의 메세지(a)→해시함수 f(x) → (ac7b6ac~~~~)고정길이, 단방향성(복호화가 안된다.)
복호화 :ac7b6ac~~~를 a로 다시 바꾸는 것.
복호화되는 것과 안 되는 것이 있다.


[java에서의 hash 함수]

public native int hashCode();
⇒구현부가 없다.
⇒알고리즘을 함부로 공개할 수 없기 때문에 native로 C++로 만들어진 hashCode() 알고리즘을 끌고온다.

진짜 주소값(new Test()) → hashCode 알고리즘 → 가짜 주소값을 반환한다.

1.32bit고정값(복호화불가)
2.64bit를 32bit로 변환하기 위해 사용

[Eclipse 연습]

[계산]
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]

[Map<K,V>인터페이스를 구현하는 컬렉션 클래스들]

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	

0개의 댓글