三鷹台でひきこもるプログラマの日記メニューコンテンツへスキップホームユニークID生成方法snowflakeをPythonで書いてみたコメントを残すユニークID生成方法としてはUUIDが有名だよね。基本UUID(version4)で必要十分なんだけど、問題もあって128bitもいらない、uint64で扱いたいのに完全にランダムなのでソートする意味がないなんてのがよく出る欠点。1はまだ我慢しろとか上位or下位64bit使ってなんとかするとか逃げようもある。2、特に時系列でIDが増加していって欲しいなんてリクエストがあると途端に使えなくなる。RDBMSのオートインクリメント機能使ったり、きちんとロック処理入れてカラムに現在のIDを保持、ID生成するたびにインクリメント、とかやることになる。それで何が嫌なのって、処理数が増えるとID生成の箇所が間違いなくボトルネックと化す。なんて話となり、結構ブルーなのである。なんかUUIDくらいお手軽で、現実的なところでユニーク性が保証できて、おおよそ時系列に沿って値が増加するユニークID生成方が欲しい。思い、google先生に教えを請いた所、snowflakeという生成方法があるそうだ。snowflakeはTwitterが以前使っていたユニークID生成方法で、かつてはgithubで公開されていたそうだ。いまでもその残骸は残っている。https://github.com/twitter/snowflake生成方法などはこのスライドがわかりやすい。http://www.slideshare.net/moaikids/20130901-snowflake簡単に言うと、3つの値からユニークIDを生成する。id下位12bitは発行する度にインクリメントされていくシリアルナンバーぱっと見、必要なユニークID生成が1msで4096ID以下であればユニーク性は守られるであろう。idをユニークに割り振って分散すればいい。UTC)ではなく、任意の時刻にセットすることで割り降れるID空間を広げる工夫も入っているようだ。timeなので、うまく時系列に並ぶ作りだ。(ミリ秒まで同じタイミングの場合は並ばないケースあり)最上位bitが必ず0なのでsignedでも安心して使える。