3

我想将字母数字(string)值转换为数字(int)。 alphanumeric'af45TR'. 我希望该数值(int)应该是unique并且它不应该超出intlike的大小64, 32 bits。我怎样才能做到这一点?。

4

3 回答 3

2

您可以映射,但对于所有字母数字,您不能拥有唯一的数字。只需使用鸽子洞原理,您就有更大的空间用于字母数字,但相对较小的空间用于数字。

所以首先指定字符串的最大长度,然后可以很容易地设计出一些算法。使用基于哈希的算法,它们具有相同哈希值的概率非常低,并且可以指定仅在哈希中返回数字。

我希望它有所帮助。

于 2013-05-31T11:31:24.697 回答
2

如果您认为字符串是以 62 为基数的数字,您可以编写一个函数来执行从 62 基数到 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
于 2013-05-31T11:33:38.593 回答
0

我必须实现从字符串到十进制然后再返回。感谢@Pudge601 提出了 base 62 的想法。请在下面找到 C# 解决方案。

限制:使用long数据类型,似乎只能处理 10 个或更少的基数为 62 的字符。使用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; 
} 

在 geeksforgeeks 的帮助下,尽管他们的解决方案对我来说并不是开箱即用的。

于 2019-01-17T07:22:48.893 回答