Php MySQL唯一哈希插入

Php MySQL唯一哈希插入,php,mysql,hash,Php,Mysql,Hash,因此,假设一个mysql表包含几个简单列、一个自动增量和一个散列(varchar,UNIQUE) 有没有可能给mysql提供一个查询,该查询将添加一列,并生成一个唯一的散列,而不需要多个查询 目前,我能想到的实现这一点的唯一方法是花一段时间,我担心随着数据库中的条目越来越多,这将变得越来越占用处理器 下面是一些伪php,显然未经测试,但可以了解其基本思想: while(!query("INSERT INTO table (hash) VALUES (".generate_hash().");")

因此,假设一个mysql表包含几个简单列、一个自动增量和一个散列(varchar,UNIQUE)

有没有可能给mysql提供一个查询,该查询将添加一列,并生成一个唯一的散列,而不需要多个查询

目前,我能想到的实现这一点的唯一方法是花一段时间,我担心随着数据库中的条目越来越多,这将变得越来越占用处理器

下面是一些伪php,显然未经测试,但可以了解其基本思想:

while(!query("INSERT INTO table (hash) VALUES (".generate_hash().");")){
    //found conflict, try again.
}
在上面的示例中,哈希列是唯一的,因此查询将失败。问题是,假设数据库中有500000个条目,我正在使用一个base36哈希生成器,包含4个字符。发生冲突的可能性几乎是1/3,我绝对不能运行160000个查询。事实上,超过5的我认为是不可接受的。

那么,我可以用纯SQL实现这一点吗?我需要生成一个base62,6个字符的字符串(比如:“j8Du7X”、字符a-z、a-z和0-9),并用它更新最后一个插入id,或者更好的是,在插入过程中生成它

我可以用MySQL处理基本的CRUD,但即使是连接也有点超出我的MySQL舒适区,所以如果这是蛋糕,请原谅我的无知

有什么想法吗?我更喜欢使用纯MySQL或PHP&MySQL,但如果另一种语言可以干净地完成这项工作,我也会构建一个脚本并使用AJAX


谢谢

这个散列是什么?看起来您只是想要一个随机生成的唯一VARCHAR列?自动递增有什么问题


无论如何,你应该使用一个更大的散列-找到一个MD5函数-(如果你真的在散列),或者一个超过4个字符的UUID生成器,是的,你可以使用一个while循环,但只需要生成一个足够大的循环,这样如果你的心是使用base-36 4个字符的散列,冲突就不太可能发生了(hashspace仅为1679616),您可能会预生成一个不在另一个表中的哈希表。然后查找唯一的哈希就很简单,只需将其从“未使用的表”移动到“已使用的表”,即O(1)


如果你的表可以想象为1/3满,你可能会考虑扩展你的HASH空间,因为它可能会在你的一生中填满。一旦空间满了,无论你使用什么算法,都将不再能找到唯一的哈希。

与ZNEAKS注释一起,为什么不使用自动增量列?将哈希保存在另一个中。(非唯一)字段,并将id连接到它(动态)。因此,您可以给用户[hash][id]。您可以使用

子字符串
函数在纯sql中解析它


由于必须使用散列,用户不能通过增加id来查看其他记录。

正如其他人所建议的那样,autoinc字段有什么问题?如果您需要字母数字值,则只需在基数36中简单地将int转换为字母数字字符串。这几乎可以用任何语言实现。

,以防有人遇到类似问题,我使用的是唯一字段,我将使用php哈希函数插入哈希,如果返回错误,我将重试。
希望由于冲突可能性较低,不会变慢。

您还可以检查MySQL函数和。这些函数生成的UUID在定义上是全局唯一的。您不必再次检查PHP生成的哈希字符串是否已经存在


我认为在某些情况下,这些功能也可以满足您的项目要求。:-

这是我们针对类似项目的方法,我们希望生成独特的优惠券代码

首先,我们使用了自动递增主键。这确保了唯一性和查询速度。 然后,我们创建了一个base24编号系统,使用a、B、C等,而不使用O和I,因为有人可能认为它们是0或1。 然后我们将自动递增整数转换为base24数字。例如,0=A,1=B,28=BE,1458965=EKNYF。我们使用base24,因为base10中的长数字在base24中的字母更少

然后,我们在表中创建了一个单独的列,即优惠券代码。该列没有索引

我们取base24并添加3个随机数,或I和O(在base24中未使用),然后将它们插入到我们的数字中。例如,EKNYF可以变成1EKON6F或EK2NY3F9。这是我们的优惠券代码,我们将其插入到优惠券代码列中。它是唯一和随机的

因此,当用户使用代码EK2NY3F9时,我们所要做的就是删除所有未使用的字符(2、3和9),然后得到EKNYF,我们将其转换为1458965。我们只需选择主键1458965,然后将优惠券代码列与EK2NY3F9进行比较


我希望这能有所帮助。

为什么需要哈希?您不能出于同样的目的使用auto_increment列吗?我需要base62,6字符哈希,用于URL字符串。我可以将auto_inc转换为base62,但这不允许我手动创建条目(假设链接-这是一个有效的base62哈希,但如果我在一家汽车公司工作,我将无法添加它。).我想我应该指定,我肯定需要这个数字是6个字符,并且假设没有冲突也不起作用,因为我肯定需要保证不会有任何冲突。虽然我可以在没有验证的情况下轻松地使用和MD5,但即使36到6是巨大的,也不足以盲目插入…因为对于应用程序,我需要它特别是base62 6个字符。我想如果需要,我会预先生成表,但即使mysql很快,运行500亿个条目仍然不是我想要的解决方案:(我预计不会有那么多条目,但我更希望是安全的,因为冲突将是灾难性的。您可以预生成约100万个哈希,然后从我描述的哈希中提取。然后/如果这些哈希值变低,您可以生成更多。这样,由于哈希的生成是提前完成的,您可以确保