ハッシュ関数をつくってみた (適当
今回は、MD5, SHA-1 などのハッシュ関数と呼ばれるものを作ってみました。
ハッシュ関数の詳細はググってください。
今回作ったものは、適当なのであまりいい特性ではないかもしれません。
コード↓
#include <iostream> #include <cstring> #include <fstream> using namespace std; const int BIT = 8; const int prime[BIT] = { 11, 13, 17, 19, 23, 29, 31, 37}; class HD { private: public: int hash(char [], int, unsigned int[]); int shash(char []); void operator = (char *ch) { shash(ch); } char str[33]; }; int HD::hash(char word1[],int wordsz1, unsigned int data[]) { unsigned int i=0, j=0, k = 2166136261, l = 0, data2[BIT] = {0}; char word[32] = { 0 }; unsigned long A, B, C, D, E, F, G, H; memset(data,0,BIT); for(l = 0; l < 2; l++) { for(i = 0; i < BIT; i++) { word[i % 32] |= k << 2; word[i % 32] += word1[i]; word[i % 32] ^= word1[i] * k; } } for(i = 0; word1[i] != 0; i++) { k = (k * 16777931) + word1[i] + word[i % 32]; data[i % BIT] += k; } for(i = 0; i < BIT; i++) { k = (k * 16777931) + data[i]; data[i] ^= prime[i] * k; data[i] &= prime[i] + k; data[i] += prime[i]; data[i] += (data[i] & k) ^ ~k; } data2[0] = data[0]; A = data2[7]; data2[1] = data[1]; B = data2[0]; data2[2] = data[2]; C = data2[1]; data2[3] = data[3]; D = data2[2]; data2[4] = data[4]; E = data2[3]; data2[5] = data[5]; F = data2[4]; data2[6] = data[6]; G = data2[5]; data2[7] = data[7]; H = data2[6]; memset(data, 0, BIT); for(j = 0; j < 64; j++) { A = (A = A ^ H * ~k) * (A = A ^ (k * A) ^ ~H); B = (B = B ^ G * ~k) * (B = B ^ (k * B) ^ ~G); C = (C = C ^ F * ~k) * (C = C ^ (k * C) ^ ~F); D = (D = D ^ E * ~k) * (D = D ^ (k * D) ^ ~E); E = (E = E ^ D * ~k) * (E = E ^ (k * E) ^ ~D); F = (F = F ^ C * ~k) * (F = F ^ (k * F) ^ ~C); G = (G = G ^ B * ~k) * (G = G ^ (k * G) ^ ~B); H = (H = H ^ A * ~k) * (H = H ^ (k * H) ^ ~A); A = ((A = A ^ (A * (A % k))) % (k * A)) ^ (k + H) ^ (~A); B = ((B = B ^ (B * (B % k))) % (k * B)) ^ (k + G) ^ (~B); C = ((C = C ^ (C * (C % k))) % (k * C)) ^ (k + F) ^ (~C); D = ((D = D ^ (D * (D % k))) % (k * D)) ^ (k + E) ^ (~D); E = ((E = E ^ (E * (E % k))) % (k * E)) ^ (k + D) ^ (~E); F = ((F = F ^ (F * (F % k))) % (k * F)) ^ (k + C) ^ (~F); G = ((G = G ^ (G * (G % k))) % (k * G)) ^ (k + B) ^ (~G); H = ((H = H ^ (H * (H % k))) % (k * H)) ^ (k + A) ^ (~H); data2[0] = A; A = data2[7]; data2[1] = B; B = data2[0]; data2[2] = C; C = data2[1]; data2[3] = D; D = data2[2]; data2[4] = E; E = data2[3]; data2[5] = F; F = data2[4]; data2[6] = G; G = data2[5]; data2[7] = H; H = data2[6]; } { data[0] = A; data[1] = B; data[2] = C; data[3] = D; data[4] = E; data[5] = F; data[6] = G; data[7] = H; } for(i = 0; i < BIT; i++) { data[i] %= 65535; if(data[i] < 0) data[i] = -data[i]; } return 0; } int HD::shash(char word[]) { unsigned int data[BIT] = { 0 },i = 0, wordsz = 0; wordsz = (unsigned int)strlen(word); hash(word,wordsz,data); memset(str, 0, 33); for(i = 0; i < BIT; i++) { sprintf(str, "%s%04x", str, data[i]); } return 0; } int main() { HD hash;// Hash Digest object hash = ""; cout << hash.str << endl; hash = "The quick brown fox jumps lazy dog";// ハッシュ化したい文字列を代入 (operator =) cout << hash.str << endl;// HD::str はハッシュ後の文字列(char str[33]) }