我想将字母数字(string)
值转换为数字(int
)。
alphanumeric
等值'af45TR'
。
我希望数字(int)
值应为unique
,并且不应超出int
的大小64, 32 bits
。我怎么能这样做?。
答案 0 :(得分:2)
您可以映射但是对于所有字母数字,您不能拥有唯一的数字。 只要使用鸽子洞原则,你就有更大的空间用于字母数字,但数字空间相对较小。
所以首先指定你的字符串的最大长度然后可以很容易地设计一些算法。使用基于散列的算法,它们具有相同散列值的概率非常低,并且可以指定为仅在散列中返回数字。
我希望它有所帮助。
答案 1 :(得分:2)
如果你认为字符串是base 62中的数字,你可以编写一个函数来执行从base 62到base 10的基本转换.PHP中的一个例子可能是;
function base62toDec($n)
{
$vals = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$vals = array_flip(str_split($vals));
$out = 0;
$len = strlen($n);
for ($i = 0; $i < $len; $i++) {
$c = $n[$len - ($i + 1)];
$out += $vals[$c] * pow(62, $i);
}
return $out;
}
echo base62toDec('af45TR'); // outputs 9383949355
答案 2 :(得分:0)
我必须实现从字符串到小数然后再返回。感谢@ Pudge601为基础的62想法。请在下面找到C#解决方案。
限制:使用long
数据类型在基数62处似乎只能处理10个字符或更少。使用int32
似乎在最坏的情况下只能处理5个字符-因此它不能处理您的示例'af45TR'
字符串。
readonly char[] charArray = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
void Main()
{
var stringToConvert = "HelloWorld";
var decimalVal = StringToDecimal(stringToConvert, 62); // outputs 598985658527080986
var result = DecimalToString(decimalVal, 62, stringToConvert.Length);
Console.WriteLine(result); // outputs HelloWorld
}
public string DecimalToString(long decimalInput, int desiredBased, int expectedStringLength)
{
Console.WriteLine($"Converting decimal value {decimalInput} to string using base {desiredBased}");
var index = 0; // Initialize index of result
var output = new char[expectedStringLength];
while (decimalInput > 0)
{
var deciValue = (decimalInput % desiredBased);
if (deciValue == 0) // handle Z value
deciValue = 62;
output[index] = charArray[deciValue-1];
index ++;
decimalInput = (decimalInput - deciValue) / desiredBased;
}
// Reverse the result
Array.Reverse(output);
return new string(output);
}
public long StringToDecimal(string input, int desiredBase)
{
Console.WriteLine($"Converting string value {input} to decimal using base {desiredBase}");
int len = input.Length;
long power = 1;
long num = 0;
for (var i = len - 1; i >= 0; i--)
{
if (Array.IndexOf(charArray, input[i]) + 1 > desiredBase)
{
throw new ArgumentException("Invalid base", nameof(desiredBase));
}
num += (Array.IndexOf(charArray, input[i]) + 1) * power;
power = power * desiredBase;
}
return num;
}
With help from geeksforgeeks,尽管他们的解决方案对我来说不是开箱即用的。