生成更短的公共ID

时间:2011-12-08 08:14:26

标签: php hash

我正在寻找一种为我的对象生成公共ID的方法(比如facebook uid)。 id应该是唯一的,用户不应该猜测它(或下一个)。

现在我正在使用它:

sha1('a fixed random string' . $this->getId())

问题是sha1会生成很长的字符串(40个字符),我希望它更短。我考虑过使用MD5,但众所周知它不能保存,因为你可以创建碰撞。在我的情况下这真的是个问题吗?

我有哪些替代方案?

5 个答案:

答案 0 :(得分:1)

如果你使用强盐(随机字符串),这不是MD5碰撞的大问题。

答案 1 :(得分:1)

如果要将ID存储在数据库中,则可以转到uniqid。如果您要在数据库中使用普通ID(那些auto_increments)并且只想使用代表ID,请在里面创建一个带有一些数学计算的函数:)

答案 2 :(得分:1)

使用随机整数而不是执行基本转换。 这个想法是你使用许多角色的目标字符集,如A-Z,a-z和0-9。这样你的号码就可以用非常短的字符串编码。

对于用户0-9和a-z的简单版本,您可以使用PHP函数base_convert: (http://codepad.org/9craDgbt)

echo base_convert ( 123456789132465798132 , 10 , 36 );

给你

c5m8nqw9ps

如果您想让它更短,请查看http://php.net/manual/de/function.base-convert.php注释中的“convBase”功能。通过增加目标字符集中的字符数,结果会变短。

convBase($randomInt,'0123456789','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

答案 3 :(得分:0)

为什么要像这样散列唯一值?我认为使用像它一样的唯一整数会好得多。

虽然,你真的想要哈希它,看看这个:http://www.php.net/manual/en/function.hash-algos.php,这是可用的哈希函数的完整列表。检查服务器上安装的内容。

答案 4 :(得分:0)

我做了一些测试,看看id将使用不同的哈希函数多长时间。我还使用convBase将0-9a-z转换为0-9a-zA-Z为suggested

$i = mt_rand(1, PHP_INT_MAX);
sha1($i):           40 322c73c44958e4219fd6679aead094192cb672fe
convBase(sha1($i)): 34 1JHrlXObHSVMcbn2bHRBCBIRD3RVKQHMQzg
md5($i):            32 7b09f8cd76be44403b90e971a5a61e6c
convBase(md5($i)):  28 5bgdGpBZekbb3PQlILrSKMtHC24A
$i:                  9 107300785
convBase($i):        5 7gdPP

因此,即使转换为另一个基数,sha1也很长。我还不确定MD5是否安全。无论如何,如果你想在Twitter上的URL中发布它,有28个字符仍然有点长: http://mydomainsux.com/invite/5bgdGpBZekbb3PQlILrSKMtHC24A

convBase($i)的最短解决方案存在不唯一的问题。您必须手动检查。不过,我认为这是去这里的方法,因为如果你使用哈希,也可能会有自然的勾结,所以你必须检查。

我读到你可以在表格中预先生成id,只需在需要时选择一个。这样您就不必每次都测试唯一性。