V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
syncher
V2EX  ›  科技

你是怎样将数字 ID 转化为字母 ID 的?

  •  
  •   syncher · 2017-03-05 13:51:18 +08:00 · 3908 次点击
    这是一个创建于 2608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一个问题,需要将数字 ID 转化为字母 ID,而且需要有一种对应关系保证数字 ID 和字母 ID 一一对应,如 11 可以转化为 aa 这样,求各位大佬给出算法或思路.

    16 条回复    2017-03-06 04:36:13 +08:00
    izdour
        1
    izdour  
       2017-03-05 14:01:25 +08:00
    。。。 md5 或 哈希?这是什么问题···
    RE
        2
    RE  
       2017-03-05 14:01:43 +08:00 via iPhone   ❤️ 2
    10 进制转 26 或 52 进制
    shoaly
        3
    shoaly  
       2017-03-05 14:05:45 +08:00
    echo "1234567890" | base64

    MTIzNDU2Nzg5MAo=
    SoloCompany
        4
    SoloCompany  
       2017-03-05 15:06:54 +08:00 via iPad
    理论的最优解的话当然是 Long.toString(id, 62 或 52),要求数字可以超过 64bit 的话可以用 bigdecimal
    zsx
        5
    zsx  
       2017-03-05 15:41:28 +08:00   ❤️ 1
    '123456'.toString().replace(/\d/g, s => String.fromCharCode(parseInt(s) - 1 + 'A'.charCodeAt())) === 'ABCDEF'
    loading
        6
    loading  
       2017-03-05 15:43:32 +08:00 via Android
    0-9 一共 10 个,字母大小写一共 52 个,映射不就好了?
    syncher
        7
    syncher  
    OP
       2017-03-05 16:26:47 +08:00
    @izdour MD5 的话是不是还会有数字??
    syncher
        8
    syncher  
    OP
       2017-03-05 16:28:27 +08:00
    有没有用 ASCII 的方法?
    xiaozi
        9
    xiaozi  
       2017-03-05 17:55:17 +08:00
    加密版本标识 + base62_encode(id * scale 倍数 + 偏移值)
    xiaogui
        10
    xiaogui  
       2017-03-05 18:13:36 +08:00
    楼主试试这个 http://hashids.org/
    changwei
        11
    changwei  
       2017-03-05 18:45:10 +08:00 via Android
    为什么会有这么奇怪的需求啊
    isCyan
        12
    isCyan  
       2017-03-05 19:26:37 +08:00 via Android
    @changwei 存网址 id 既不想暴露数据库自增值又不想单独存储两种不同 id 的对应关系
    cnwtex
        13
    cnwtex  
       2017-03-05 21:22:58 +08:00
    @isCyan

    function id62($strnum,$isdecode = false){
    $id62obj = load::classes('id62','','LkEhbDuyXTV8iMrcIPNCGQqm1sHz2Kw5eafnJS4vYoj7gWORtF30pA6dZUlBx9');
    if($isdecode){
    return $id62obj->decode($strnum);
    }else{
    return $id62obj->encode($strnum);
    }
    }

    id62 就是 62 进制函数
    isCyan
        14
    isCyan  
       2017-03-05 22:21:53 +08:00 via Android
    @cnwtex 这样还是暴露了自增值啊
    cnwtex
        15
    cnwtex  
       2017-03-05 23:08:27 +08:00
    @isCyan 没看见字符串是 random 的吗?
    NeoAtlantis
        16
    NeoAtlantis  
       2017-03-06 04:36:13 +08:00 via Android
    直接找个加密算法大不了 AES 把数字加密然后转成 base64 ……密钥什么的自己定。可以双向转换,保证一对一,保证随机。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2598 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:09 · PVG 00:09 · LAX 09:09 · JFK 12:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.