这是问题所在,我需要将ID(定义为长整数)转换为较小的alfanumeric标识符。详情如下:
关于如何解决这个问题的任何指示?
答案 0 :(得分:1)
假设您不需要两个方向的公式(如果您将13位数字减少为5或6个字符的字母数字字符串则不可能):
如果您最多可以有6个字母数字字符,那么就可以使用36 6 = 2,176,782,336种可能性,假设只有数字和大写字母。
要将较大的13位数字映射到此空间,您可以采用略小于该值的某个素数的模数,例如2,176,782,317,使用base-36编码对其进行编码。
alphanum_id = base36encode(longnumber_id % 2176782317)
对于一组500,这会给你一个
2176782317 P 500 / 2176782317 500 发生碰撞的机会
(P是排列)
答案 1 :(得分:1)
最佳选择是使用区分大小写的字符将基数更改为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()))
答案 2 :(得分:0)
如何使用某些base-X转换,例如123123412341234
17N644R7CI
变为9999999999999
而3JLXPT2PR
变为System.setProperty
?
答案 3 :(得分:0)
如果你需要一个既可以使用两个方向的映射,也可以选择更大的基础。
含义:使用base 16,您可以将1到16减少为单个字符。 因此,base36是允许更短字符串的“最大值”(当需要1-1映射时)!