バイナリとしてのSHA1ハッシュの格納

SHA1ハッシュを文字列として格納するのはあまり容量効率がよくありません。文字列としてのSHA1は少なくとも40バイト必要で、符号化方式を格納するためにさらに1バイト必要です。

一方、SHA1をバイナリとして格納する場合は、実際のSHA1のために20バイト、追加で1バイトか4バイトの領域が必要になります(これもデータベースの内部構造に依存します)。つまり、最良のシナリオでは、使用領域を50%削減することができます。

これを扱いやすくするために、ShaAttribute をモデルに組み込み、sha_attribute クラスメソッドを使用して SHA 属性を定義することができます。例えば

class Commit < ActiveRecord::Base
  include ShaAttribute

  sha_attribute :sha
end

これにより、sha 属性の値をバイナリとして保存しながら、文字列であるかのように使用することができます。つまり、データを正しいバイナリ形式に変換することを気にすることなく、このようなことができるのです:

commit = Commit.find_by(sha: '88c60307bd1f215095834f09a1a5cb18701ac8ad')
commit.sha = '971604de4cfa324d91c41650fabc129420c8d1cc'
commit.save

SHAを格納するカラムはバイナリ型で_なければ_なりません。Railsの場合、これは:text:stringの代わりに:binary 型を使う必要があることを意味します。