短いアドレスのアルゴリズムC++版、POCOライブラリを使います

1859 ワード

#include "Poco/Foundation.h"
#include "Poco/UUID.h"
#include "Poco/UUIDGenerator.h"
#include "Poco/MD5Engine.h"

using Poco::UUID;
using Poco::UUIDGenerator;
using Poco::MD5Engine;
using Poco::DigestEngine;


int short_url(std::string out[],std::string text)
{
	std::string key = "mylib";//     MD5         KEY 
	static char chars[] = {//     URL    
		'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
		'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
		'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
		'y', 'z', '0', '1', '2', '3', '4', '5',
		'6', '7', '8', '9', 'A', 'B', 'C', 'D',
		'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
		'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
		'U', 'V', 'W', 'X', 'Y', 'Z'
	};
	MD5Engine engine;
	engine.update(key + text);
	std::string hex = engine.digestToHex(engine.digest());
	int hexLen = hex.length();
	int subHexLen = hexLen / 8;

	for (int i = 0; i < subHexLen; i++)
	{
		std::string outChars = "";
		//int j = i + 1;
		std::string subHex = hex.substr(i * 8, 8);
		long val = 0;
		char *str;
		val = (int)strtol(subHex.c_str(), &str, 16);
		long idx = 0x3FFFFFFF & val;
		for (int k = 0; k < 6; k++)
		{
			int index = (int)0x0000003D & idx;
			outChars += chars[index];
			idx = idx >> 5;
		}
		out[i] = outChars;
	}
	return 0;
}
ネット上のjavaコードに基づいて変更されました.