关于从有限集中获取随机值的这个问题让我思考......
人们想要从一组Y值中检索X个唯一值是相当普遍的.例如,我可能想从一副牌中交出一手牌.我想要5张牌,我希望它们都是独一无二的.
现在,我可以天真地做到这一点,通过挑选一张随机卡5次,每次重复时再试一次,直到我得到5张牌.然而,对于大型集合中的大量值,这并不是那么好.例如,如果我想从一组1,000,000中获得999,999个值,则此方法会变得非常糟糕.
问题是:有多糟糕?我正在找人解释一个O()值.获得第x个数字将需要y次尝试...但有多少?我知道如何解决任何给定的值,但是有一种直接的方法可以推广整个系列并得到一个O()值吗?
(问题不是:"我怎样才能改进这个?"因为它相对容易修复,而且我确信它在其他地方已被多次覆盖.)
Youtube似乎每个视频都有一个独特的11位数代码.代码包括1-9,A-Z,a-z,和一些符号等+_*.
他们如何计算每个视频的唯一代码?我正在做一些我想为每条记录分配一个唯一代码的东西,因此问题就在于此.
我的问题/疑虑是:
ID为数据库中的每条记录采用自动生成和自动递增的列是否有意义,然后以某种方式将该唯一ID列转换为11位数代码?我的目标是:
我正在尝试生成非顺序的人类可读订单代码,这些订单代码派生自(比方说)一个从1开始的无符号32位内部id,并为每个新订单自动递增.
在我下面的示例代码中,每个$hash都是唯一的吗?(我计划对其进行base34编码$hash,使其具有人类可读性.)
<?php
function int_hash($key) {
$key = ($key^0x47cb8a8c) ^ ($key<<12);
$key = ($key^0x61a988bc) ^ ($key>>19);
$key = ($key^0x78d2a3c8) ^ ($key<<5);
$key = ($key^0x5972b1be) ^ ($key<<9);
$key = ($key^0x2ea72dfe) ^ ($key<<3);
$key = ($key^0x5ff1057d) ^ ($key>>16);
return $key;
}
for($order_id = 1; $order_id <= PHP_INT_MAX; ++$order_id) {
$hash = int_hash($order_id);
}
?>
Run Code Online (Sandbox Code Playgroud)
如果没有,有没有关于如何更换的建议int_hash?
结果说,base34编码a md5($order_id)对我来说太长了.