バイナリとしての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
型を使う必要があることを意味します。