Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 指定长度的唯一ID生成_Hash - Fatal编程技术网

Hash 指定长度的唯一ID生成

Hash 指定长度的唯一ID生成,hash,Hash,我需要创建一个设置长度的唯一和随机字母数字ID。理想情况下,我会在数据库中从0开始存储一个计数器,每次我需要一个唯一的ID时,我都会得到计数器值(0),通过这个哈希函数运行它,给它一个设置的长度(可能是4-6个字符)[ID=Hash(counter,4);],它会返回我的新ID(例如7HU9),然后我会增加计数器(0++=1) 我需要保持身份证的简短,以便他们可以记住或分享容易。安全性不是什么大问题,所以我不担心人们尝试随机ID,但我不希望ID是可预测的,因此用户不会有机会注意到ID每次增加3,

我需要创建一个设置长度的唯一和随机字母数字ID。理想情况下,我会在数据库中从0开始存储一个计数器,每次我需要一个唯一的ID时,我都会得到计数器值(0),通过这个哈希函数运行它,给它一个设置的长度(可能是4-6个字符)[ID=Hash(counter,4);],它会返回我的新ID(例如7HU9),然后我会增加计数器(0++=1)

我需要保持身份证的简短,以便他们可以记住或分享容易。安全性不是什么大问题,所以我不担心人们尝试随机ID,但我不希望ID是可预测的,因此用户不会有机会注意到ID每次增加3,这样他们就可以通过ID反向工作并逐个下载ID数据(例如A5F9、A5F6、A5F3、A5F0==坏)

我不想只是通过随机字符串循环检查唯一性,因为这会随着密钥的使用而增加数据库负载。目的是散列唯一递增计数器将保证ID的唯一性,直到某个计数器值,此时生成的ID的长度将增加一倍e计数器重置,并永远继续此模式

有人知道适合这种需要的哈希函数吗,或者有其他想法吗


编辑:我不需要反转函数来获取计数器值。

正如您所意识到的,最困难的部分是保证无冲突序列

如果猜测算法所需的标准是“不明显”,那么您可能需要一个完整周期的简单混合全等RNG,或者更确切地说是一个模数递增的序列,以满足随时间增长的要求。这不是您要求的哈希方法,但它应该可以工作

以非常简洁的形式介绍了MCRNG的基本知识和完整周期的充分条件。还有许多其他的

首先使用最低模量MCRNG,从任意种子开始,直到“用完”其循环,然后前进到下一个最大模量


你需要“步进”模以确保唯一性。例如,如果你的第一个id是12位,因此你有一个模M1让我们假设你的计数器的范围是1到10000。切片[1,10000]到10个小单位,每个单位包含1000个数字。这些小单位将跟踪他们的最后一个id

 unit-1    unit-2              unit-10
[1 1000], [1001, 2000], ... ,[9000, 10000]
当你需要一个ID时,只需从单元1-10中随机选择,并获取单元的最新ID。 例如 首先,您的计数器是1,随机选择是unit-2,然后您将得到ID=1001; 第二次,你的计数器是2,随机选择是unit-1,你会得到ID=1; 第三次,你的计数器是3,随机选择是单位2,你会得到ID=1002; …等等。

(这是一段时间以前的事了,但我应该写下我最后做了什么…)

我想到的想法其实很简单。我想要字母数字管脚,这样每个字符就可以有36个潜在字符,我想从4个字符管脚开始,这样就可以有36^4=1679616个可能的管脚。我意识到我想要做的就是拿走所有这些可能的管脚,然后扔掉一部分可能的管脚以一种随机的方式使用em,这样一个人随机找到一个的几率很低。所以我将1679616除以100,然后将我的计数器乘以1到100之间的随机数,然后将该数字编码为我的字母数字pin。问题解决了

通过猜测4个字母和数字的随机组合,你有百分之一的机会真正猜到正在使用的pin,这正是我真正想要的。在我的实现中,一旦可用pin空间用完,我就会增加pin长度,并且一切都很好!已经运行了大约2年了