SHA1 해시를 바이너리로 저장하기

SHA1 해시를 문자열로 저장하는 것은 공간 효율성이 매우 좋지 않습니다. SHA1을 문자열로 저장하려면 최소 40바이트가 필요하며, 인코딩을 저장하기 위한 추가 바이트와 PostgreSQL의 내부에 따라 더 많은 공간이 필요할 수 있습니다.

반면에, 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 타입을 사용해야 합니다.