我有一些包含字母数字值的字符串,比如
asdf1234
,
qwerty//2345
等等。。
我想生成一个与字符串相关的特定常量。该数字不应与生成的与其他字符串对应的任何数字匹配。。
它必须是一个数字吗?
您可以简单地对字符串进行散列,这将给您一个唯一的值。
echo md5('any string in here');
注意:这是一个单向散列,不能从散列转换回字符串。
密码通常是这样存储的(使用这个或另一个散列函数,通常添加"salt"方法。)然后通过对输入进行散列并与存储的散列进行比较来检查密码。
edit:md5散列长度为32个字符。
看看其他散列函数:
http://us3.php.net/manual/en/function.crc32.php(返回一个数字,可能为负数)
http://us3.php.net/manual/en/function.sha1.php(40个字符)
您可以使用像md5这样的哈希函数,但这不是很有趣。
相反,你可以将字符串转换成ASCII字符序列(因为你说它是字母数字)-这样,它就可以很容易地转换回来,对应于字符串的长度(确切地说是长度*3),它有0碰撞的机会,因为它只是将它转换成另一种表示形式,总是一个数字,它更有意思。。。示例代码:
function encode($string) {
$ans = array();
$string = str_split($string);
#go through every character, changing it to its ASCII value
for ($i = 0; $i < count($string); $i++) {
#ord turns a character into its ASCII values
$ascii = (string) ord($string[$i]);
#make sure it's 3 characters long
if (strlen($ascii) < 3)
$ascii = '0'.$ascii;
$ans[] = $ascii;
}
#turn it into a string
return implode('', $ans);
}
function decode($string) {
$ans = '';
$string = str_split($string);
$chars = array();
#construct the characters by going over the three numbers
for ($i = 0; $i < count($string); $i+=3)
$chars[] = $string[$i] . $string[$i+1] . $string[$i+2];
#chr turns a single integer into its ASCII value
for ($i = 0; $i < count($chars); $i++)
$ans .= chr($chars[$i]);
return $ans;
}
示例:
$original = 'asdf1234';
#will echo
#097115100102049050051052
$encoded = encode($original);
echo $encoded . "'n";
#will echo asdf1234
$decoded = decode($encoded);
echo $decoded . "'n";
echo $original === $decoded; #echoes 1, meaning true
您正在寻找一个散列函数,例如md5。您可能想向它传递$raw_output=true参数以访问原始字节,然后将它们强制转换为您想要的数字的任何表示形式。
加密哈希函数会为每个输入字符串提供不同的数字,但这是一个相当大的数字——例如,在SHA-1的情况下是20字节。原则上,两个字符串可以产生相同的哈希值,但这种情况发生的几率非常小,可以忽略不计。
如果你想要一个更小的数字,比如32位整数,那么你就不能使用哈希函数,因为冲突的概率太高了。相反,您需要记录已建立的所有映射。制作一个将字符串与数字相关联的数据库表,每次给你一个字符串时,都要在表中查找。如果您在那里找到它,请返回相关的号码。如果没有,请选择任何现有记录都没有使用的新编号,并将新字符串和编号添加到表中。