Help us learn about your current experience with the documentation. Take the survey.
将 SHA1 哈希存储为二进制
将 SHA1 哈希存储为字符串的空间效率并不高。一个字符串形式的 SHA1 至少需要 40 字节,还需要额外 1 字节来存储编码,并且根据 PostgreSQL 的内部结构可能需要更多空间。
另一方面,如果将 SHA1 存储为二进制形式,只需要 20 字节来存储实际的 SHA1 值,外加 1 或 4 字节的额外空间(同样取决于数据库内部结构)。这意味着在最佳情况下,我们可以将空间使用减少 50%。
为了更方便地使用,你可以将 ShaAttribute concern 包含到模型中,并使用 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 来说,这意味着你需要使用 :binary 类型而不是 :text 或 :string。