2010-10-07 186 views

回答

6

PHP整数可能存储的信息量是有限的。可以存储在字符串中的信息量不是(至少如果字符串不是不合理的长度)。

因此,您需要将任意长度的字符串压缩为非任意长度的整数。这是不可能没有数据丢失。

您可以使用散列算法,但散列算法可能总是碰撞。特别是如果你想将一个字符串散列为整数,碰撞概率相当高 - 整数只能存储非常少的数据。

因此,您应该坚持使用电子邮件或使用自动递增整数字段。

+0

你能否更好地解释你的答案,特别是最后一段,谢谢 – jspeshu 2010-10-07 11:20:24

+0

我必须说的很好的推理,但我可以@至少找到一个功能,例如:我有一个字段,即电子邮件,这是一个VARCHAR(40)然后,因为这些字段是唯一的所有值而不是使用哈希来避免合谋,我会添加一些值说XXXX,使他们的长度== 40仍然是唯一的,那么我怎么能有这个 – jspeshu 2010-10-07 11:24:17

+2

那么一个独特的int。我仍然不认为你会找到这样一个函数:一个40个字符的字符串可能被存储在40个字节(如果它是ascii,unicode将需要*甚至更多*)。另一方面,整数只有8个字节(并且只在64位机器上)。因此,你仍然需要存储40字节的8字节... – NikiC 2010-10-07 11:36:56

4

尝试binhex功能

从上述网站:

<?php 
$str = "Hello world!"; 
echo bin2hex($str) . "<br />"; 
echo pack("H*",bin2hex($str)) . "<br />"; 
?> 

输出

48656c6c6f20776f726c6421 
Hello world! 
+0

可以把它生成一个唯一的INT现在是看它“48656c6c6f20776f726c6421”六角左右 – jspeshu 2010-10-07 12:06:40

+0

取决于INT有多大,但 - 有一个int值5216694956355254127 – 2010-10-07 21:16:40

2

为什么不直接对数据库的自动递增ID字段?

+0

我没有DB I从ldap服务器读取数据,唯一唯一的字段是他们的电子邮件地址 – jspeshu 2010-10-07 11:03:17

+2

+1这就是正确的方法。没有字符串魔法。 – NikiC 2010-10-07 11:03:28

+0

你不需要这种方法的数据库,我想你可以为文件名增量的每个类别都有一个文本文件增量。 – Vass 2010-10-07 11:06:43

0

如果电子邮件是ascii文本,您可以使用PHP ord function来生成一个唯一的整数,但它会是一个非常大的数字!

该方法是一次处理一个字符的电子邮件地址,为每个字符调用ord。 ord函数返回一个唯一表示字符值的整数。您可以用零填充每个数字,然后使用字符串连接将它们插入对方。

考虑“abc”。

ord("a"); 
>> 97 

ord("b"); 
>> 98 

ord("c"); 
>> 99 

垫这些数字与0,和你有一个唯一的编号呢,那就是:970980990

我希望有帮助!

+0

长度限制如何这个电子邮件怎么样“[email protected]”是否有一个相当的int为此我不这么认为b/se php有一些常量叫PHP_MAX_INT或类似的东西 – jspeshu 2010-10-07 11:57:17

+0

是的,这将是要克服的问题。正如大家所说,这不是正确的做法 - 我只是想强调一种方法,以防有所帮助。 – adamnfish 2010-10-07 12:28:48

-1

为什么不在本地创建自己的关联表,它将绑定具有唯一整数的电子邮件?

所以工作流程将是的线:有意义

1 get the record from the ldap server. 
2 check it locally if it has already an int assigned. 
2.1 if yes use that int. 
2.2 if no, generate an associative row in the table locally. 
3 do your things with the unique ids. 

呢?

+0

对不起,但没有得到... – jspeshu 2010-10-07 12:02:46

+0

您可以维护您的电子邮件和整数列表之间的关联的唯一方法是有一个持久层(例如数据库),将作为您的电子邮件之间的映射器和号码。因此,请在本地创建数据库表或文件并存储数据,如下所示:[email protected] = 1001,[email protected] = 1002等。 – Slavic 2010-10-07 12:07:13

+0

这就是我想避免的以及是什么导致我出现此问题?但是,谢谢你,我认为这个人@nikic得到了它 – jspeshu 2010-10-07 12:13:12

-1

可以使用此功能:

function stringToInteger($string) { 
    $output = ''; 
    for ($i = 0; $i < strlen($string); $i++) { 
     $output .= (string) ord($string[$i]); 
    } 
    return (int) $output; 
} 

有点难看,但工程:)

+1

你可能要先将所有电子邮件地址转换为小写,以便始终获得一致的字符串值(strtolower) – Hightower 2012-09-27 07:46:14

+0

(int)转换不正确,因为它总是会返回长字符串的最大int值 – Rajesh 2014-07-10 14:22:35

1

此代码生成其可以使用,因为它或作为BIGINT /类似的数据类型64位号码数据库如MySQL等

function get64BitNumber($str) 
{ 
    return gmp_strval(gmp_init(substr(md5($str), 0, 16), 16), 10); 
} 

echo get64BitNumber('Hello World!'); // 17079728445181560374 
echo get64BitNumber('Hello World#'); // 2208921763183434891 
echo get64BitNumber('http://waqaralamgir.tk/'); // 12007604953204508983 
echo get64BitNumber('12345678910'); // 4841164765122470932 
相关问题