当前位置: 首页 > 知识库问答 >
问题:

在gorm中自动插入哈希编码数据

家浩瀚
2023-03-14

我有一个表,表示我的用户数据。有一个表示电话号码的字段,我想在更新或插入时自动将其哈希存储在数据库中。所以我的模型是:

type Users struct {
    gorm.Model
    ID          uint          `gorm:"autoIncrement;unique" json:"id"`
    PhoneNumber string        `json:"phone_number"`
    HashID      string        `gorm:"primaryKey" json:"hash_id"`
    Name        string        `gorm:"default:dear user" json:"name"`
    Rank        uint          `json:"rank"`
    Score       uint          `json:"score"`
    Image       string        `json:"image"`
    Email       string        `json:"email"`
    Address     string        `json:"address"`
    Birthday    string        `json:"birthday"`
    Biography   string        `json:"biography"
}

如何告诉GORM在插入或更新数据时用PhoneNumber列的sha256哈希代码填充HashID列?

共有1个答案

韶浩皛
2023-03-14

你需要这样的东西:

package main

import (
    "crypto/sha256"

    "fmt"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type Users struct {
    gorm.Model
    Key  string `json:"phone_number"`
    Hash string `gorm:"primaryKey" json:"hash_id"`
}

func (u *Users) BeforeCreate(tx *gorm.DB) (err error) {
    h := sha256.Sum256([]byte(u.Key))
    u.Hash = fmt.Sprintf("%x", h[:])
    return nil
}

func (u *Users) BeforeSave(tx *gorm.DB) (err error) {
    h := sha256.Sum256([]byte(u.Key))
    u.Hash = fmt.Sprintf("%x", h[:])
    return nil
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    db.AutoMigrate(&Users{})

    u := Users{Key: "123"}
    db.Create(&u)
}

检查https://gorm.io/docs/index.html

 类似资料:
  • 下面的代码是正确的,但我不明白为什么两行代码可以工作。我指的是最后一块。具体地说,我指的是这两行: newword->next=hashtable[index]; hashtable[index]=newword; 如果目标是在哈希表的索引处将节点追加到链表,那么为什么newword->next指向哈希表的索引,而该索引处可能已经有节点了。我认为它应该是newword->next=NULL,因为该

  • 我试图使用Datastax驱动程序将作为<code>int、time、hash</code>提供的值存储到Cassandra中。 哈希显示为< code>{ "Q17.1_4"= 已将表定义为: 整数 时间戳 地图 PK(int,时间戳) 我可以把PK插入ok,但是我很难把哈希值强制转换成Cassandra可以处理的东西。 创建了一个准备好的语句,并在(尝试)遍历值时使用它: 如果我将“val”作

  • 问题内容: 基本类型(例如int)的哈希码是什么? 例如,假设num是一个整数。 问题答案: 对于一个最自然的选择是使用本身。一个更好的问题是,用什么的的,因为它不适合的尺度的哈希码。您的最佳解决方案以及所有相关问题将是有效的Java。

  • 我使用eclipse生成Object的hashCode和equals方法的覆盖,并生成了一些关于hashCode覆盖的问题。下面的hashCode()是否正确? 问题: -为什么eclipse会生成两行代码?我认为将两个结果相加是合适的。知道为什么它们是分开的任务吗? -最终的int素数可以是任何素数吗? -整数结果是否应始终为 1?

  • 我正在我想要存储字符串的哈希程序中使用DJB2哈希函数。但是这个哈希函数返回一个非常大的无符号int值作为返回值(哈希表索引)。如果我的表大小很小(比如说13),有没有办法把这个大值转换成更小的。我只想尽可能避免碰撞。 DJB2哈希函数代码如下:

  • 我有一个定义如下的散列表: 此映射由作为键的字段名称和作为课程值的字段值组成。我正在尝试制作一个将 HashMap 和表名作为参数的方法。我的查询必须具有以下格式,因为我不会插入到表中的所有列: 列的数量当然取决于散列表的大小。我如何通过遍历散列表来实现这一点呢?以下是我迄今为止使用不同方法得出的结论,但我不认为它会正常工作: