提问人:Jonas0000 提问时间:11/13/2017 更新时间:8/18/2020 访问量:3917
字符串加密 - 生成独特的模式,如 Spotify 代码
String encryption - generate unique pattern like Spotify codes
问:
昨天我读了问题 从字符串创建 costum 模板/代码的算法。因为这个问题没有表述得那么好,所以它立即被否决了。然而,在我看来,这个问题本身并没有那么糟糕,所以我决定再次问这个问题,希望有更好的版本。
好的,我想知道字符串加密(例如新 Spotify 代码)是如何工作的。如下图所示:
我对在 javascript 中实现这种模式加密的程度非常感兴趣。
这 Spotify 代码 - 我在上面已经提到过 - 是一行结构的,分为不同大小的条。
因此,假设有一行分为 24 个条形,所有条形的大小都可以为“3”、“5”、“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 种不同的大小。
解释:
我将字符串“hello”转换为二进制格式,并将字符串分成最多 3 个组,得到如下结果:['001', '110', '0']。
之后,我使用上面的结果数组,并在下面的键数组中找到匹配项并获取索引(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())
答:
您似乎在假设从字符串“Coffee”到显示的图形存在直接映射。这种假设几乎可以肯定是不正确的。
首先,考虑一下如果有两首不同的歌曲叫做“咖啡”会发生什么。您建议的算法将为它们分配相同的代码。这似乎不合理。您希望代码唯一标识歌曲。
其次,歌曲名称可以任意长。例如,平克·弗洛伊德(Pink Floyd)有一首歌,叫做“几种毛茸茸的小动物聚集在一个洞穴里,用皮克特开槽”。您的编码算法可能无法将其放入 24 个小节中。即使可以,我也总能找到更长的歌名。
给定字母 a-z,有 11,881,376 个可能的 5 个字符字符串。如果您只想对所有可能的编码进行唯一编码,只需 23 位即可完成。只需将字符串视为以 26 为基数的数字并进行转换即可。
最有可能的是,Spotify 正在为每首歌曲分配一个唯一的编号,然后对该编号进行编码。字符串“Coffee”与您在屏幕上看到的图形代码之间没有直接映射。
更新:我问了一个类似的问题,有人链接了这个条形码的专利,回答了这个问题。总而言之,他们使用中间查找表将条形码链接到唯一的 Spotify ID。
我一直在深入研究 Spotify 代码,一些试图理解它们。
Spotify 有每首歌曲、专辑、艺术家、用户、播放列表等的 URI。它们看起来像这样:
spotify:playlist:37i9dQZF1DXcBWIGoYBM5M
如果您访问 Spotify 代码,您可以从 URI 生成代码。上述 URI 的代码如下所示:
如您所指出的,它们对每个条形图高度中的信息进行编码,其方式与美国邮政局在其条形码中执行的编码方式相同(请参阅智能邮件条形码)。
中的条形图 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 个字符,包含 .这意味着潜在的 URI 或 .spotify 代码中有 23 个柱线,但第一个和最后一个始终为 0,因此只有 21 个可用柱线。这意味着或潜在的代码。URI 到代码的映射并不简单,因为没有 1 个代码到 1 个 URI。0-9 a-z A-Z
62^22
2.7 e39
8^21
9.22 e18
我不知道他们如何将 URI 映射到代码。我的猜测是他们有一个单独的数据库/查找表,用于将代码映射到 URI。创建代码时,他们将 URI 哈希为代码并存储该代码以供以后查找。当有人查找代码时,他们会检查该数据库并将其映射到 URI。由于还有更多潜在的 URI,它们永远不会被使用,也不必担心它们。
上一个:在div的角落画三角形
下一个:在地图中更改指南针图像
评论