我正在寻找一种为我的对象生成公共ID的方法(比如facebook uid)。 id应该是唯一的,用户不应该猜测它(或下一个)。
现在我正在使用它:
sha1('a fixed random string' . $this->getId())
问题是sha1会生成很长的字符串(40个字符),我希望它更短。我考虑过使用MD5,但众所周知它不能保存,因为你可以创建碰撞。在我的情况下这真的是个问题吗?
我有哪些替代方案?
答案 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,只需在需要时选择一个。这样您就不必每次都测试唯一性。