You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让GORM插入/更新时自动将PhoneNumber的SHA256哈希存入HashID字段

实现方案

GORM 支持生命周期钩子,你可以通过为 Users 模型实现 BeforeCreate 和 BeforeUpdate 方法,在插入、更新操作执行前自动计算手机号的 SHA256 哈希并赋值给 HashID 字段,具体步骤如下:

1. 引入依赖包

首先导入哈希计算需要的包:

import (
    "crypto/sha256"
    "encoding/hex"
    "gorm.io/gorm"
)

2. 实现钩子方法

给 Users 结构体添加两个钩子方法,分别在插入和更新前触发:

// 创建前触发
func (u *Users) BeforeCreate(tx *gorm.DB) (err error) {
    // 仅当手机号不为空时计算哈希
    if u.PhoneNumber != "" {
        hash := sha256.Sum256([]byte(u.PhoneNumber))
        u.HashID = hex.EncodeToString(hash[:])
    }
    return
}

// 更新前触发
func (u *Users) BeforeUpdate(tx *gorm.DB) (err error) {
    // 仅当手机号被更新时重新计算哈希
    if tx.Statement.Changed("PhoneNumber") {
        hash := sha256.Sum256([]byte(u.PhoneNumber))
        u.HashID = hex.EncodeToString(hash[:])
    }
    return
}

注意事项

  • 你提供的模型代码中 Biography 字段的 Tag 末尾缺少反引号,需要修正避免编译报错
  • 你的模型同时嵌入了 gorm.Model 并自定义了 ID 字段,gorm.Model 本身已经包含 ID 字段,二者会冲突,建议要么删除自定义的 ID 字段,要么去掉 gorm.Model 嵌入自行定义所需的时间、删除标记字段
  • 如果业务场景中允许手机号为空,你可以按需补充空值场景下的 HashID 生成逻辑

内容的提问来源于stack exchange,提问作者Mohammad Derakhshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:09:01