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

能否将password_hash生成的字符串作为数据库主键存储?

嘿,这个问题拆解成两个部分来看就清晰多了,我来给你详细说说:

一、把password_hash()的结果存入主键token字段是否可行?

技术上是完全可行的,但有几个关键细节要注意:

  • 首先,password_hash()默认使用的bcrypt算法生成的哈希是固定60个字符长度的,所以你的数据库token字段一定要设置足够的长度(比如VARCHAR(255)),绝对不能因为字段长度不够导致哈希被截断——一旦截断,后续用password_verify()验证时就会彻底失效。
  • 主键的核心要求是唯一且非空,而默认调用password_hash()时,函数会自动生成随机盐值并嵌入到哈希结果里。哪怕是同一个原始字符串,每次生成的哈希结果都不一样,这就天然满足了主键的唯一性要求(极端情况下随机盐重复的概率低到可以忽略不计)。
  • 不过提个小建议:用哈希值当主键并不是常规的数据库设计思路,通常我们会用自增ID、UUID这类更轻量、更易管理的标识。但如果你的业务场景确实需要用这个哈希作为唯一标识,技术层面完全没问题。

二、再次生成的哈希是否会和之前存入数据库的结果相同?

正常情况下完全不可能。原因很简单:

  • PASSWORD_DEFAULT默认采用的bcrypt算法,每次调用password_hash()时都会自动生成一个随机的盐值,这个盐值会直接包含在最终输出的哈希字符串中。盐值是随机生成的,所以两次调用哪怕输入的是同一个字符串,输出的哈希结果也必然不同。
  • 除非你手动通过password_hash()的第三个参数$options指定了相同的盐值,但官方强烈不建议这么做——手动指定盐会大幅降低哈希的安全性,也违背了这个函数自动生成安全盐的设计初衷。所以只要你用默认参数调用,就完全不用担心重复的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:34