【问题标题】:Hashing a long integer ID into a smaller string将长整数 ID 散列为较小的字符串
【发布时间】:2016-10-05 23:08:47
【问题描述】:

这就是问题所在,我需要将一个 ID(定义为长整数)转换为一个较小的字母数字标识符。详情如下:

  • 问题上的每个人都作为一个唯一的 ID,一个大小为 13 的长整数(类似于 123123412341234)。
  • 我需要生成此唯一 ID 的较小表示形式,即字母数字字符串,类似于 A1CB3X。问题是 5 或 6 个字符的长度不足以表示这么大的整数。
  • 新 ID(例如 A1CB3X)在我们知道只有少数人(少于 500 人)存在的情况下应该是有效的。新 ID 在这一小部分人中应该是唯一的。
  • 新 ID(例如 A1CB3X)应该是对原始 ID 进行计算的结果。这意味着将原始 ID 带到别处并应用相同的计算,我们应该得到相同的新 ID(例如 A1CB3X)。
  • 应在将个人添加到集合时进行此计算,这意味着当时并不知道属于该集合的所有个人。

关于如何解决此类问题的任何指示?

【问题讨论】:

标签: algorithm hash


【解决方案1】:

假设您不需要一个双向的公式(如果您将 13 位数字减少为 5 或 6 个字符的字母数字字符串,这是不可能的):

如果您最多可以有 6 个字母数字字符,那么您有 366 = 2,176,782,336 种可能性,假设只有数字和大写字母。

要将较大的 13 位数字映射到该空间,您可以取一些比它略小的素数取模,例如 2,176,782,317,使用 base-36 编码对其进行编码。

alphanum_id = base36encode(longnumber_id % 2176782317)

对于一组 500 个,这给了你一个

2176782317P500 / 2176782317500 碰撞几率

(P是排列)

【讨论】:

    【解决方案2】:

    最好的选择是使用区分大小写的字符将基数更改为 62

    如果您希望它更短,您可以添加 unicode 字符。见下文。

    这是给你的 javascript 代码:https://jsfiddle.net/vewmdt85/1/

    function compress(n) {
        var symbols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð'.split('');
        var d = n;
        var compressed = '';
    
        while (d >= 1) {
            compressed = symbols[(d - (symbols.length * Math.floor(d / symbols.length)))] + compressed;
            d = Math.floor(d / symbols.length);
        }
    
        return compressed;
    }
    
    $('input').keyup(function() {
            $('span').html(compress($(this).val()))
    })
    
    $('span').html(compress($('input').val()))
    

    【讨论】:

      【解决方案3】:

      如何使用一些base-X 转换,例如123123412341234base-36 中变成17N644R7CI9999999999999 变成3JLXPT2PR

      【讨论】:

        【解决方案4】:

        如果您需要双向映射,您可以选择更大的base

        含义:使用基数 16,可以将 1 到 16 减少为单个字符。 因此,base36 是允许较短字符串的“最大值”(当需要 1-1 映射时)!

        【讨论】:

          猜你喜欢
          • 2013-04-11
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 2017-10-22
          相关资源
          最近更新 更多