LoginSignup
0
0

More than 1 year has passed since last update.

C++ で ULID 生成

Posted at

はじめに

はじめまして、らくだです。

今回が初の投稿になるので、見づらいと思います。
どうか、ご容赦ください。

今回、記事を投稿するに至ったのは、「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/

目次

  1. gitからコピペ
  2. 重要
  3. 実行
  4. 参考文献

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を以下のコードに変更

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

このような値が出ます。

いかがでしたでしょうか。
探り探りでやったので、間違いがあるかもしれません。
見つけましたら、コメントよろしくお願いします。

ソースコードをみて、各関数がどのような動きをしているのか見てみるのも面白いと思います。

それでは、今回はこのあたりで失礼します。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0