如何在php中将字符串转换为唯一整数

如何在php中将字符串转换为唯一整数,php,Php,如何转换字符串i.e。向唯一整数发送电子邮件地址,以将其用作ID。尝试此功能 从上述网站: <?php $str = "Hello world!"; echo bin2hex($str) . "<br />"; echo pack("H*",bin2hex($str)) . "<br />"; ?> 为什么不在数据库上设置一个自动递增的ID字段?PHP整数可以存储的信息量是有限的。如果字符串不是不合理的长,那么至少可以存储在字符串中的信息量是不合理的 因此,

如何转换字符串i.e。向唯一整数发送电子邮件地址,以将其用作ID。

尝试此功能

从上述网站:

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

为什么不在数据库上设置一个自动递增的ID字段?

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

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

您可以使用哈希算法,但哈希算法可能总是有冲突。特别是如果你想把一个字符串散列成一个整数,冲突概率非常高——整数只能存储很少的数据


因此,您要么坚持使用电子邮件,要么使用自动递增的整数字段。

如果电子邮件是ascii文本,您可以使用PHP生成唯一的整数,但这将是一个非常大的数字

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

以abc为例

ord("a");
>> 97

ord("b");
>> 98

ord("c");
>> 99
用0填充这些数字,就有了一个唯一的数字,即:970980990


我希望这有帮助

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

因此,工作流程如下所示:

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.

这有意义吗?

您可以使用此功能:

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

有点难看,但很管用:

这段代码生成64位的数字,可以用作MySQL等数据库的数据类型,也可以用作bigInt/类似的数据类型

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
您可以使用crc32功能

例如:

$email = "user@gmail.com";
echo $email . " = " . crc32($email);


实例:

我没有数据库,我正在从ldap服务器读取数据,唯一唯一的字段是他们的电子邮件地址。这种方法实际上不需要数据库,我想您可以为每一类文件名增量设置一个文本文件增量。我希望用户使用特定用户的唯一url更新ldap服务器上的数据,但每次打开该链接时都一样。现在服务器上唯一独特的东西就是他们的电子邮件,所以我想把他们的电子邮件转换成一个唯一的数字,这样其他的计算就会变得友好。但现在我正在考虑在后台使用他们的电子邮件,不用担心独特的int功能……谢谢大家,有人会用cookie吗?不是唯一的链接,这是一个真正基于用户状态的get字符串,对吗?你能更好地解释你的答案吗,尤其是最后一段,谢谢你我必须说的很好的理由,但是我至少可以找到一个函数来做这件事,例如,我有一个字段,即email,它是VARCHAR40,那么既然这些字段对于所有值都是唯一的,而不是使用散列来避免共谋,我将添加一些值,比如XXXX,这样它们的长度==40仍然是唯一的,那么我如何从这个井中获得唯一的int。我仍然不认为你会找到这样一个函数:一个40个字符的字符串可能存储在40个字节中,如果它是ascii,unicode将需要更多。另一方面,一个整数只有8个字节,而在64位机器上只有8个字节。因此,您仍然需要在8个字节中存储40个字节…这很有说服力,但正如他们所说,我需要一些神奇的功能,非常感谢顺便问一下,长度限制如何,例如,这封电子邮件如何thisemailaddress@thisdomain.com我不认为b/se php有一个称为php_MAX_int或是的,这将是需要克服的问题。大家都说,,这不是正确的方法-我只是想强调一种有帮助的方法。它现在可以生成一个唯一的整数吗?看看48656c6c6f20776f726c6421一个十六进制或sodepends这个整数有多大-它有一个整数值521669495635525127唯一可以在电子邮件和整数列表之间保持关联的方法是有一个持久层,例如数据库,它将作为电子邮件和数字之间的映射器。因此,在本地创建数据库表或文件,并按如下方式存储数据:user1@email.com = 1001, user2@email.com=1002,等等,这就是我想要避免的,是什么让我想到这个问题的?但是谢谢你,我认为这个家伙@nikic是不可理解的,但是在这种情况下,你无能为力,因为没有这样的事情会无冲突地从字符串中创建int,这正是nikic所说的原因。你可能想先将所有电子邮件地址转换成小写,因此,您总是会得到一个一致的字符串值strToLower。int cast是不正确的,因为它总是会为长字符串返回最大int值
$email = "user@gmail.com";
echo $email . " = " . crc32($email);