はじめに
はじめまして、らくだです。
今回が初の投稿になるので、見づらいと思います。
どうか、ご容赦ください。
今回、記事を投稿するに至ったのは、「c++でulid生成」を紹介する日本語の記事が見当たらなかったので、参考になればと思ったからです。
ちなみに、c++でのulid生成に絞って紹介しますので、ulidがどのようなものかについては、ほかの記事をあたってください。
今回、参考させていただいた記事↓
ulid/c++
https://github.com/suyash/ulid
ミリ秒単位の経過時間取得
https://www.delftstack.com/ja/howto/cpp/how-to-get-time-in-milliseconds-cpp/
目次
gitからコピペ
まず、実行用のディレクトリ配下に、
下記のurlから2つのファイルをコピぺします。
https://github.com/suyash/ulid
コピペするファイルは、
ulid_struct.hh
ulid.hh
コピペでなく、クローンしてもらっても構いません。
今回は、二つだけ使わせてもらうので、コピペにしました。
重要
ここからは、投稿主が実際にはまった場所です。
先ほどコピペしたファイルの、ulid_struct.hhではtime_tという型が使われています。どうやらこいつが、主の実行環境では31bitなようで、ulidは最初の48bitがtimestampなので、シフト演算のbit数が超過しておかしな値になります。
これを解消するために、ulid_struct.hh内のtime_t型をすべてlong long型にします。(uint64_tでも構いません)
実行
実行用「ulid.cc」ファイルを同じディレクトリに入れます。
test
├ ulid_struct.hh
├ ulid.hh
├ ulid.cc
ulid.ccを以下のコードに変更
#include "ulid.hh"
#include <iostream>
#include <chrono>
#include <random>
using std::cout; using std::endl;
using std::chrono::duration_cast;
using std::chrono::milliseconds;
using std::chrono::seconds;
using std::chrono::system_clock;
std::string ulid_s(void){
//ミリ秒単位の経過時間
long long now = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
//第二引数:0~255範囲の乱数を生成する関数
ulid::ULID ulid = ulid::Create(now, []() { return rand() % 256 - 1; });
std::string str = ulid::Marshal(ulid);
std::cout << str << endl;
return str;
}
int main(void){
srand((unsigned int)time(NULL));
ulid_s();
return 0;
}
以上で終了です。
実行してみますと
01GMSM5HFF70YG5AC3F8T9EVPQ
このような値が出ます。
ちなみに、ulid::Createの引数を(1484581420, { return 4; })にすると
0001C7STHC0G2081040G208104
このような値が出ます。
いかがでしたでしょうか。
探り探りでやったので、間違いがあるかもしれません。
見つけましたら、コメントよろしくお願いします。
ソースコードをみて、各関数がどのような動きをしているのか見てみるのも面白いと思います。
それでは、今回はこのあたりで失礼します。