我想将字母数字(string)
值转换为数字(int
)。
alphanumeric
像'af45TR'
. 我希望该数值(int)
应该是unique
并且它不应该超出int
like的大小64, 32 bits
。我怎样才能做到这一点?。
问问题
10562 次
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 回答