AKARI Tech Blog

燈株式会社のエンジニア・開発メンバーによる技術ブログです

ローリングハッシュをスプレッドシートで実現して朝会のチーム分けを行う

こんにちは。燈株式会社 DX Solution事業本部 VPoE の丸尾です。 4月になり、燈にも新たな仲間が加わりました!燈では、新メンバーが馴染みやすくなる仕組みとして、朝会を毎週月曜日の朝に実施しております。 内容や目的は時期によって少しずつ変化していますが、現在は以下の3点を主な目的としています。

  • 事業部を越えたメンバー同士の交流
  • 今週の個人目標の共有
  • 全社の方向性の共有

とくに「事業部を越えた交流」については、数人のチームに分かれてテーマトークを行う形式を採用しています。 チームごとにテーマを設けて(趣味や新年の抱負など、アイスブレイクになるものから真面目な話題まで幅広く)、 メンバー一人ひとりが順に話す、という形です。

参加メンバーが増えてくると、悩ましいのがチーム分けの運用です。 以前は「ランダムに座って、その場で近くの人と組む」ようにしていましたが、次第に席が固定化し、 自然とチームも固定メンバーになってしまう傾向が出てきました。 このままでは本来の目的である「事業部を越えた交流」が薄れてしまいます。

そこで今回、Googleスプレッドシート上で自動的にチームを編成する仕組みを作りました(Google Apps Script不使用)ので、これを紹介したいと思います。

全体の流れ

大まかな流れとしてメンバーのメールアドレスと現在の日付によってハッシュ化を行なった後、数値で順位づけしてチーム数で割った余りをチーム番号に割り当てることで、メンバーのチーム分けを行います。

メールアドレスからチーム番号を割り当てるまで(チーム数10の場合)

しかし、スプレッドシートではmd5関数やsha256関数などは用意されておらず、文字列をハッシュ化することは容易ではありません。そこで自前で文字列の扱いとハッシュの計算を実装する必要があります。

メールアドレスからハッシュ値

文字列からハッシュ値の計算する流れ

メールアドレスをハッシュ値にするには、まずは文字列をなんとかして数字の列に変換することを考えます。文字列を数字の列に変換するには、

  1. まずSPLIT関数で文字列を一文字ごとセルに分割
  2. 各セルをCODE関数で数値(Unicode表の数値)に変換

を行います。

SPLIT関数の挙動。REGEXREPLACE関数で全ての文字に「$」文字をつけてその後に「$」で分割

CODE関数の挙動。空白セルは0になるように処理

これで、メールアドレスから数字の列に変換することができました。これをなんらかのハッシュ値に割り当てるために、今回はローリングハッシュという方法を使いました。

ローリングハッシュ

ローリングハッシュは競技プログラミングで文字列検索などで用いるアルゴリズムです。蟻本に詳細が書かれていますが、簡単に説明しつつ、今回の要件である日付によって値を変化させるという工夫も入れています。

cが入力数字の列、nが列の長さ、mは適当に大きな素数(例えば1000000007)を使います。bは基数と呼ばれる値になり、適当に選択することができます。競技プログラミングの実践的には複数の値を使って衝突を回避するテクニックを用いることもあります。今回の用途では、bに現在の日付(例えば20250417)の値を使うことで日付ごとにハッシュ値を変化させています。

分割したセルを左から足し込むことによって、スプレッドシートでも十分実現可能なアルゴリズムになります。

ローリングハッシュの計算の様子。一行目に bi を事前計算しておく

今後の課題

この計算方法がメールアドレス・日付が変わったときにどの程度ばらつくのかは不明です。実際、運用を続けていく上で、連続で同じメンバーと同じチームになることが観測されており、この方法がどの程度ランダムになっているのかを別途検証する必要があります。

We’re Hiring!

燈では競技プログラミングアルゴリズム実装が好きなメンバーが集まっています!興味がある方、ぜひカジュアル面談でお話しましょう!お待ちしています!

akariinc.co.jp