String 字符串转换为唯一的十进制数

String 字符串转换为唯一的十进制数,string,unicode,decimal,unique,crc32,String,Unicode,Decimal,Unique,Crc32,我有格式为(0-9)(A-Z)(A-Z)(A-Z)(A-Z)的字符串,例如0AAAA或7ZHSK等 我想要一种独立于平台的方式将其转换为唯一的十进制数 我已经试过crc32,它非常接近我想要的,并且我已经测试过所有4569760可能的组合都没有碰撞 我的问题是crc32在32位机器和64位机器上输出不同的结果 有没有类似的东西能让你胜任这份工作?我需要使用多语言的标准函数,所以没有自定义函数 编辑: 以下是在这两个位置运行的代码示例: echo crc32('1AAAA'); 为什么不使用

我有格式为(0-9)(A-Z)(A-Z)(A-Z)(A-Z)的字符串,例如0AAAA或7ZHSK等

我想要一种独立于平台的方式将其转换为唯一的十进制数

我已经试过crc32,它非常接近我想要的,并且我已经测试过所有4569760可能的组合都没有碰撞

我的问题是crc32在32位机器和64位机器上输出不同的结果

有没有类似的东西能让你胜任这份工作?我需要使用多语言的标准函数,所以没有自定义函数

编辑: 以下是在这两个位置运行的代码示例:

echo crc32('1AAAA');


为什么不使用位置值语义呢?结果只需要23位,因此完全符合标准积分类型:

#include <cinttypes>
#include <string>

std::uint32_t to_int(std::string const & s)
{
    return
       (s[4] - 'A') * 1 +
       (s[3] - 'A') * 26 +
       (s[2] - 'A') * 26*26 +
       (s[1] - 'A') * 26*26*26 +
       (s[0] - '0') * 26*26*26*26;
}
#包括
#包括
std::uint32_t to_int(std::string const&s)
{
返回
(s[4]-“A”)*1+
(s[3]-“A”)*26+
(s[2]-“A”)*26*26+
(s[1]-“A”)*26*26*26+
(s[0]-“0”)*26*26*26*26;
}

(这假设字符串编码包含连续序列中的所有大写字母字符,例如UTF-8。)

这是哪种CRC实现?当然,CRC只有在所有平台上的行为都相同时才有意义。@biziclop我在不同系统上使用PHP时注意到了这一点。如果机器上的CRC不同,那么您的实现中就有一个bug。在任何情况下,此应用程序的CRC-32都是愚蠢的,因为数据可以在不到32位的情况下完全编码。@MarkAdler请参见编辑的问题我添加了一些示例,显示不同的系统为相同的函数返回不同的结果。这些是相同的32位值,在一种情况下打印为有符号,在另一种情况下打印为无符号。
output = 3760894406
#include <cinttypes>
#include <string>

std::uint32_t to_int(std::string const & s)
{
    return
       (s[4] - 'A') * 1 +
       (s[3] - 'A') * 26 +
       (s[2] - 'A') * 26*26 +
       (s[1] - 'A') * 26*26*26 +
       (s[0] - '0') * 26*26*26*26;
}