CS345 이번 과제는 여러가지 해시 알고리즘을 직접 구현하는것이었다.

In the program spec, Dr. Moon wrote that a family of hash functions would be created by h sub k(s) = MyUtil.ELFhash(s, 2^k) for k > 0. Since M = 2^k, in order to find the value of k (so we can pass it into the argument of ElfHash when creating the extended function), we need to find the log2(M), am I correct? If so, how do I find this in Java? I cannot find any fuctions in Java’s math utility that returns the log base 2 of a number.

메일링 리스트에 대략 이런 내용의 글을 올린 사람이 있어서 잠시 log(N) 의 값을 구하는 방법에 대해서 생각해보게 되었다. 사실 구할 필요도 없긴 하지만.

log(N)
	c = 0
	while(N > 1)
		N = N >> 1
		c = c + 1
	end
	return c
end

대략 의사 코드(pseudo code)로 작성해보았다. 길이가 짧기도 하고 복잡한 조건도 없어서 아주 예뻐보인다 :D

public int log(int n) {
	int c = 0;
	while(n > 1) {
		n = n >> 1;
		c++;
	}
	return c;
}

자바로는 이렇게 구현하면 될까나… 어떤 언어든지 1분 내로 구현할 수 있다고 본다. 어셈블리어는 제외.

이미 눈치 챈 사람도 있겠지만, N 의 값이 2의 k제곱이 아닐때에는 결과값이 floor of log(N) 이 된다. 아~ 이거 의외로 쓸만할지도 모르겠다.