ソースコード
SuperUUID.hpp
#pragma once
#include <random>
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
class SuperUUID {
public:
SuperUUID(size_t x4ByteNum = 4) {
Create(x4ByteNum);
}
SuperUUID(const std::string& str) {
StringTo(str);
}
~SuperUUID() {
delete[] Data;
}
void Create(size_t x4ByteNum) {
ByteNum4x = x4ByteNum;
Data = new uint32_t[ByteNum4x];
std::random_device rand;
for (size_t i = 0; i < ByteNum4x; ++i) {
Data[i] = rand();
}
}
SuperUUID& operator =(const SuperUUID& r) {
this->ByteNum4x = r.ByteNum4x;
delete[] this->Data;
this->Data = new uint32_t[this->ByteNum4x];
std::copy(r.Data, r.Data + r.ByteNum4x, this->Data);
return *this;
}
SuperUUID& operator =(const std::string& r) {
SuperUUID ret(r);
return ret;
}
bool operator ==(const SuperUUID& r) const {
if (this->ByteNum4x != r.ByteNum4x) {
return false;
}
for (size_t i = 0; i < ByteNum4x; ++i) {
if (this->Data[i] != r.Data[i]) {
return false;
}
}
return true;
}
bool operator !=(const SuperUUID& r) const {
return !((*this) == r);
}
std::string ToString() {
std::string ret;
std::ostringstream ss;
for (size_t i = 0; i < ByteNum4x; ++i) {
ss << std::setfill('0') << std::setw(8) << std::setbase(16) << Data[i];
ret += ss.str();
ss.str("");
}
return ret;
}
void StringTo(const std::string& str) {
size_t size = (str.size() / 8) + (str.size() % 8 == 0 ? 0 : 1);
delete[] Data;
Data = new uint32_t[size];
ByteNum4x = size;
std::string tData;
for (size_t i = 0; i < ByteNum4x; ++i) {
tData = "0x";
tData += str.substr(i * 8, 8);
Data[i] = std::stoul(tData, nullptr, 16);
}
}
private:
size_t ByteNum4x;
uint32_t* Data;
};
出力例
使い方
コンストラクタで長さを決めます
x4ByteNum
*8文字分になります
長さを決めたらあとは自動で作られます
動的なものはデストラクタでちゃんと廃棄されるので安心してください
std::string
からSuperUUID
の変換、SuperUUID
からstd::string
の変換ができます
std::string
からSuperUUID
へ変換する場合16進数表記である必要があります