我有一些包含字母数字值的字符串,比如
asdf1234
,
qwerty//2345
等等..
我想生成一个特定的常数与该字符串相关联。这个数字不应该与其他字符串生成的任何数字相匹配。
我有一些包含字母数字值的字符串,比如
asdf1234
,
qwerty//2345
等等..
我想生成一个特定的常数与该字符串相关联。这个数字不应该与其他字符串生成的任何数字相匹配。
需要是数字吗?
您可以简单地对字符串进行哈希处理,这将为您提供一个唯一的值。
echo md5('any string in here');
你可以使用像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
length*3
更改为 length*2
?我是初学者。 - Alfred加密哈希函数将为每个输入字符串提供一个不同的数字,但它是一个相当大的数字——例如,在SHA-1的情况下是20字节。原则上,两个字符串可能会产生相同的哈希值,但发生的概率非常小,被认为是可以忽略不计的。
如果您想要一个更小的数字——比如32位整数——那么您不能使用哈希函数,因为碰撞的概率太高了。相反,您需要记录所有已建立的映射。创建一个数据库表,将字符串与数字关联起来,每次给定一个字符串时,在表中查找它。如果在表中找到它,则返回相关的数字。如果没有找到,则选择一个未被任何现有记录使用的新数字,并将新字符串和数字添加到表中。