我有一个董事会,我想禁用注册,而我希望用户能够使用基于IP地址的唯一ID自由发布
例如:
如果“Joe”IP为200.100.15.117,“Joe”昵称将成为200.100.15.117的哈希函数
如果“Joe”IP更改,他将获得另一个ID,这无关紧要,我只需要每个IPAddress一个唯一ID
还有两件重要的事情:
我想在使用MD5功能然后将其修剪为8个字符,但这有多独特?有更好的方法吗?
答案 0 :(得分:2)
您可以将IP地址字符串转换为LONG(4个字节)并随后执行任何操作。
查看php函数ip2long。
答案 1 :(得分:1)
这个问题是你不能在同一个网络上区分两个人,所以如果我在那里发帖,我的宿舍邻居去了网站,该网站认为他就是我。
你应该考虑使用cookies,这些可以很容易地变得独一无二,并且AFAIK不能被远程攻击。
对于唯一ID部分,如果要将“用户”存储在数据库中,则只需从“用户”表中分配主键,然后在cookie中使用该键。
如果它的长度为8个字符,则可以在ID前加0 - 例如00000001,00000002 ....这种方式非常独特,而且8个字符长 -
答案 2 :(得分:0)
编辑根据OP对此答案的评论。
下面的代码使用BC Math库将MD5哈希转换为Base-90字符串。这会将32个字符串转换为20个字符串。这远远不是所需的8个字符,但它是使用ASCII范围的最小字符串长度(可以通过使用字符'
"
\
将基数增加到Base-94 [space]
但这不会影响字符串长度,而是在处理数据时可能会导致问题。)
$ip = '200.100.15.117';
$hash = md5($ip);
$chars16 = array(
'0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
'6' => 6, '7' => 7, '8' => 8, '9' => 9, 'a' => 10, 'b' => 11,
'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15
);
$base10 = '0';
for ($i = strlen($hash) - 1; $i > 0; $i--) {
$base10 = bcadd($base10, bcmul($chars16[$hash[$i]], bcpow(16, $i)));
}
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,;.:-_+*?!$%&@#~^=/<>[](){}`';
$base = (string)strlen($chars);
$baseX = '';
while (bccomp($base10, $base) === 1 || bccomp($base10, $base) === 0) {
$baseX = substr($chars, bcmod($base10, $base), 1) . $baseX;
$base10 = preg_replace('/\.\d*$/', '', bcdiv($base10, $base));
}
$baseX = substr($chars, $base10, 1) . $baseX;
echo $baseX; // Shows: 1BS[JdZf/7J$J{ud&r5i
答案 3 :(得分:0)
你可以对ip地址加盐,例如
$salt = "e45re%$#";
$ip = "200.111.123.111";
$hash = md5($ip.$salt);
$hash = substr($hash,0,8);