Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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
Php 从ID数组生成唯一的固定整数ID_Php_Arrays_Algorithm_Math_Uniqueidentifier - Fatal编程技术网

Php 从ID数组生成唯一的固定整数ID

Php 从ID数组生成唯一的固定整数ID,php,arrays,algorithm,math,uniqueidentifier,Php,Arrays,Algorithm,Math,Uniqueidentifier,现在的情况是。。。我得到了一个对象数组,每个对象都标有唯一的整数id,对于这些对象的每个组合,我需要创建新的对象,每个对象都有唯一的id。问题是对象列表是动态的,在无状态环境中使用,所以新生成的ID在每次运行时都必须是相同的 >为了让我更清楚这里所需要的,请考虑对象数组作为它们的ID数组,例如:[ 10, 7, 23 ]。基本上,我需要为所有可能的组合获取ID: 10,7 10,23 7,23 10,7,23 这里重要的是,对于每个不同的组合,生成的id必须相同(例如:10和7应该始终生成相同

现在的情况是。。。我得到了一个对象数组,每个对象都标有唯一的整数id,对于这些对象的每个组合,我需要创建新的对象,每个对象都有唯一的id。问题是对象列表是动态的,在无状态环境中使用,所以新生成的ID在每次运行时都必须是相同的

<> >为了让我更清楚这里所需要的,请考虑对象数组作为它们的ID数组,例如:[ 10, 7, 23 ]。基本上,我需要为所有可能的组合获取ID:
10,7
10,23
7,23
10,7,23

这里重要的是,对于每个不同的组合,生成的id必须相同(例如:10和7应该始终生成相同的id)。此外,新添加的对象不应影响以前生成的ID。因此,例如,当某个新对象稍后添加到该列表中时,从以前的组合生成的ID必须与添加新对象之前保持相同

目前,我有一个解决方案,基本上可以归结为通过组合id的总和生成新id,因此生成的id是:
17
33
30
四十

当然,这种方法可能会产生重复的ID,这就是为什么我要征求一些更复杂算法的建议。我还尝试为新生成的ID引入1000的固定偏移量,并将总和与组合中的对象数相乘,例如,生成的ID是1034(1000+(10+7)*2)、1066(1000+(10+23)*2),等等,但我不确定这是否能避免重复

很明显,我需要这个用于某些PHP项目,但由于这个问题不是特定于语言的,我希望有一些好的数学家能够带来一些好的解决方案。:)

有用的信息是,组合ID的范围为10000-99999,组合中的最大项数不超过10

请注意,对于如何从数组元素生成所有组合,我不需要解决方案,只需要生成整数id的“公式”


提前谢谢。

我不确定你的目标是什么,但我会试试

你试过使用字符键吗?例如,10、7、3成为带有下划线的序列。每个序列都有一个唯一的散列

$arrayOfKeys = array(10, 7, 3);
$hash = implode('_', $arrayOfKeys);
print $hash;

# 10_7_3
就我个人而言,我会选择这种简单的方法。如果您使用的是数据库,而不是每天生成100k条记录,那么使用索引(主键或唯一)varchar字段应该非常快

如果要创建数字,这里有一个提示:取最大数字的长度,这将是序列的前缀,例如:

10, 5, 1 -> 2100501
105, 45, 201 -> 3105045201
前缀将告诉您以下序列的长度。我想不出任何办法让你得到双打。。。有人吗?;)


希望它有帮助…

步骤1:对得到的值进行排序。 如果你得到10,7或7,10,那么在进入ID生成器之前应该得到7,10。如果您知道数字的范围,即假设[0-100]使用基数或计数排序,则速度会很快

步骤2:将数字表示为字符串,用任何选择的分隔符分隔。(“:”)可能。 例如:对于7,10 id将变成“7:10”

正在进行排序,以避免为10、7和7、10生成不同的ID


顺便问一下,这些数字代表什么?

我认为这是不可能的,除非你允许标签长度增加

假设您最多有
N个
不同的对象,对应于
N个
不同的标签

如果您希望能够表示所有可能的对,假设对中的顺序无关紧要,那么您可能需要
N.(N-1)/2
额外的标签,不管它们是什么,并且您需要保留所有标签

对于所有三元组,
N.(N-1)。(N-2)/6
,对于所有四元组,
N.(N-1)。(N-2)。(N-3)/24

这将以指数增长,并将很快超过整数的容量


任何其他试图压缩标签空间的解决方案(如哈希)都会导致冲突。您可以通过维护冲突表来解决冲突,但这将打破“每次运行生成的id必须相同”的要求。

您可以使用数组中每个id/对象的索引,而不是使用每个id的值吗?如果是这样,那么只要您有少于32个不同的对象,那么您就可以通过使用从包含的索引生成的位字段,为每个组合生成唯一的ID,假设没有值被多次使用。如果所有ID都必须是整数,并且您不能对其值进行任何假设,则没有任何解决方案可以保证唯一性,由于鸽子洞原理,这取决于几件事。任何单个项目的最大id是多少?组合中的物品数量有限制吗?组合的id是否必须与单个项目的id大小相同(即,它们是否都是
int
,或者组合id是否可以是
长的
?)。你的问题是否可以解决取决于这些问题的答案。一个项目的最大id是99999,但也有最小编号,即10000。组合中的对象数不超过10。嗯,这是不可取的,但假设生成的ID可以
。数组键不能用于生成id。因此您的id范围是89999,需要17位。如果要为最多10个项的组合生成保证唯一的id,则需要170位。这类解决方案的问题是它们不适合整数。这取决于体系结构,我错了吗?64位拱形可以容纳大于32的整数。此外,mysql最多可以容纳20位数字(bigint)作为id。。。我遗漏了什么?您正在合并的三个ID也可以如此大。只有当结果的上限大于输入值时,你的方法才有效