Php 生成较短的公共id

Php 生成较短的公共id,php,hash,Php,Hash,我正在寻找一种为我的对象生成公共ID的方法(比如facebook uid)。id应该是唯一的,用户不应该猜到它(或下一个) 现在我用的是: sha1('a fixed random string' . $this->getId()) 问题是sha1生成很长的字符串(40个字符),我希望它更短。我曾考虑过使用MD5,但众所周知它不能保存,因为您可以创建冲突。这真的是我的问题吗 我有什么选择?如果使用强salt(随机字符串),MD5冲突不是什么大问题。为什么要这样散列唯一值?我认为像这样使用

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

现在我用的是:

sha1('a fixed random string' . $this->getId())
问题是sha1生成很长的字符串(40个字符),我希望它更短。我曾考虑过使用MD5,但众所周知它不能保存,因为您可以创建冲突。这真的是我的问题吗


我有什么选择?

如果使用强salt(随机字符串),MD5冲突不是什么大问题。

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


尽管您确实想对其进行散列,但请看以下内容:,这是可用散列函数的完整列表。检查服务器上安装了什么。

如果要将ID存储在数据库中,则可以选择。如果要在数据库中使用普通id(那些自动增量),并且只想使用代表性id,请创建一个包含一些数学计算的函数:)

使用随机整数,然后执行基本转换。 其思想是使用多个字符的目标字符集,如a-Z、a-Z和0-9。通过这个,你的数字可以被编码成一个很短的字符串

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

给你

c5m8nqw9ps
如果您想让它更简短,请查看的注释中的函数“convBase”。通过增加目标字符集中的字符数,结果会变短

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

我做了一些测试,看看id将使用不同的哈希函数多长时间。我还用于将0-9a-z转换为0-9a-zA-z,如下所示:

所以sha1很长,即使转换到另一个基地。而且我仍然不确定MD5是否安全。无论如何,如果你想在twitter上的URL上发布28个字符,它仍然有点长:

使用
convBase($i)
的最短解决方案存在不唯一的问题。你必须手动检查。不过,我认为这是一种方法,因为如果你使用散列,也可能会有自然的共谋,所以你无论如何都要检查


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

因为如果您的页面是/invitation/3,下一个页面是/invitation/4,则可以查看所有邀请。是的,我知道ACL可以解决这个问题,但你需要用户帐户,但很简单,我不想在这个页面上。关于algo列表的好提示。其中大多数我都不知道;)但它们都有点长,甚至更长。不过,谢谢你抽出时间!uniqid()根据时间生成id,因此根本不安全。如果你使用$more_熵参数,可能会更好…?@PiTheNumber,Ehmm,是的,会更好,但那会太长(我想你想要10-11个整数)。您可以生成一个前缀并使用前缀存储。提示1:当发生冲突时,您始终可以附加一个递增的后缀。提示2:大素数模。您的对象已经在数据库中了吗?他们有整数ID吗?如果是这样的话,只需使用对您的ID进行编码,就可以获得唯一的、随机的、可逆的ID。否则,生成带有如下内容的随机字符串。@caw您的评论和操作看起来像垃圾邮件。你应该在你的评论和个人资料中明确你与这些项目的关系。convBase使用大写字符是非常酷的。在维基百科上,他们有一个1024位的共谋例子。我认为,如果算法被破坏,那么将其延长也无济于事。尽管如此,我仍然不确定在这个用例中是否存在碰撞问题。谢谢你的意见!顺便说一句:mt_rand不利于安全性,请使用/dev/uradom。
convBase($randomInt,'0123456789','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
$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