字符串加密 - 生成Spotify代码

时间:2017-11-13 15:31:43

标签: javascript arrays string algorithm encryption

昨天我已经阅读了问题Algorithm to create costum Template/Code from String。因为这个问题没有得到很好的解决,所以它只是立即被投票。然而,问题本身在我看来并不那么糟糕,所以我决定再次问这个问题的希望更好的版本。

好的,我想知道如何进行字符串加密,例如新的Spotify代码正在运行。见下图:

Spotify Codes

  

我会非常感兴趣的是在javascript中实现像这种模式加密这样的程度。

Spotify代码 - 我已经在上面提到 - 按行分为不同大小的条形码。

所以,让我们说有一行被划分为24个小节,所有小节都可以有#3; 3' 5' 5',&#39 ; 7'或者' 9'。

 string = 'hello'   -->  pattern = '3,3,5,7,9,3,7,9,9,3,3,5,3,9,5,3,3,7,5,9,3,9,3,9'


将一个字符串(让5个字符)转换为一个独特的模式是一个很好的方法/简单的方法,之后它也可以转换回来并作为字符串读取?

这是我迄今为止开发的代码,但是在这段代码中,我使用了一个包含10种不同可能性的键阵列( - >吧尺寸),但我只喜欢4种不同的尺寸。

说明:

我'转换我的字符串'你好'二进制格式并将字符串分成最多3个组,以得到这样的结果:[' 001',' 110',' 0']。

之后我使用上面的结果数组并在下面的Key-array中找到匹配项并获取索引(10种不同的索引 - > 10种不同的可能性)并将它们用作条形大小。

  

但是,必须有一种更有效的方法将字符串转换为独特的模式。我希望有人可以帮我改进我的小算法。提前一百万感谢。



var key = ['0', '1', '000','001','010','100','110','101','011','111']


String.prototype.encode = function() {
  var code = this, result = [],encryped_string=[]
  for (var i=0; i<code.length;i++) result.push(code[i].charCodeAt(0).toString(2).match(/.{1,3}/g));
  for (var i=0; i<result.length; i++) for (var j=0; j<result[i].length; j++) encryped_string.push(key.indexOf(result[i][j]))
  return encryped_string
}



var code = 'hello';
console.log(code.encode())
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:4)

更新:我问了一个类似的问题,was answered的有人联系了此条形码的专利。总之,他们使用中间查找表将条形码链接到唯一的Spotify ID。

我一直在研究Spotify代码以尝试理解它们。

Spotify具有每首歌曲,专辑,艺术家,用户,播放列表等的URI。它们看起来像这样:

spotify:playlist:37i9dQZF1DXcBWIGoYBM5M

如果您访问Spotify Codes,则可以从URI生成代码。上面的URI的代码如下:

Image of a spotify barcode

您已经注意到,它们以与美国邮政总局在其条形码中相同的方式在每个条形的高度中对信息进行编码(请参见Intelligent Mail barcode)。

Spotify代码中的条形图具有8个不同的高度。徽标是最大高度,第一栏和最后一栏始终是最低高度。在上图中,最大高度为96像素,条形图分为8个不同的高度框:[96, 84, 74, 62, 52, 40, 28, 18]

使用此(某种混乱的Python)代码,我可以从条形码图像中获取八进制序列:

from skimage import io
from skimage.filters import threshold_otsu
from skimage.measure import label, regionprops
from skimage.morphology import square
from skimage.color import label2rgb, rgb2gray

def get_sequence(filename):
    image = io.imread(filename)
    image = rgb2gray(image)
    b_and_w = image > threshold_otsu(image)
    labeled = label(b_and_w)
    bar_dims = [r.bbox for r in regionprops(labeled)]
    bar_dims.sort(key=lambda x: x[1], reverse=False)
    spotify_logo = bar_dims[0]
    max_height = spotify_logo[2] - spotify_logo[0]
    sequence = []
    for bar in bar_dims[1:]:
        height = bar[2] - bar[0]
        ratio = height / max_height
        if ratio < 0.25:
            sequence.append(0)
        elif ratio < 0.33:
            sequence.append(1)
        elif ratio < 0.46:
            sequence.append(2)
        elif ratio < 0.5625:
            sequence.append(3)
        elif ratio < 0.677:
            sequence.append(4)
        elif ratio < 0.8:
            sequence.append(5)
        elif ratio < 0.9:
            sequence.append(6)
        elif ratio < 1.1:
            sequence.append(7)
        else:
            raise ValueError('ratio is too high')
    return sequence

序列映射如下:37i9dQZF1DXcBWIGoYBM5M -> [0, 6, 0, 2, 4, 5, 1, 4, 5, 2, 3, 7, 3, 7, 1, 5, 6, 2, 5, 7, 4, 3, 0]

关于这件事的怪异之处是URI中的信息量和Spotify代码不匹配。 URI长22个字符,包含0-9 a-z A-Z。这意味着62^22个潜在的URI或2.7 e39。 Spotify代码中有23个小节,但是第一个和最后一个始终为0,因此只有21个可用小节。这意味着8^219.22 e18潜在代码。 URI到代码的映射并不简单,因为没有1个代码到1个URI。

我不知道它们如何将URI映射到代码。我的猜测是,他们有一个单独的数据库/查找表,可用于将代码映射到URI。创建代码时,他们将URI散列到代码中,并将其存储起来以便以后查找。当某人查找代码时,他们检查该数据库并将其映射到URI。由于存在更多潜在的URI,因此它们永远不会被使用,也不必担心它们。

答案 1 :(得分:3)

您似乎在假设有一个直接映射字符串&#34; Coffee&#34;到显示的图形。这种假设几乎肯定是不正确的。

首先,考虑如果有两首不同的歌曲叫做#34;咖啡会发生什么。&#34;您提出的算法将为它们分配相同的代码。这似乎是不合理的。您希望代码唯一标识歌曲。

其次,歌曲名称可以任意长。例如,Pink Floyd的一首歌叫做#34;几种小毛茸茸的动物聚集在洞穴中并用Pict开槽。&#34;您的编码算法可能无法将其融入24个小节。即使可以,我总能找到更长的歌曲。

给定字母a-z,有11,881,376个可能的5个字符的字符串。如果您只想对所有可能的进行唯一编码,那么只需23位即可。只需将字符串视为base-26数字并进行转换。

最有可能的是,Spotify会为每首歌曲分配一个唯一的编号,然后对该编号进行编码。字符串&#34;咖啡&#34;之间没有直接映射。以及您在屏幕上看到的图形代码。