为 R 中的字符串创建唯一的、人类可读的标识符(哈希?)
Create unique, human-readable identifiers (hash?) for strings in R
我有一组字符串需要转换为唯一的短标识符。
标识符应该是:
- 独一无二;不同的字符串产生相同的标识符应该非常不太可能
- 自动;我不想创建/硬编码手动标识符(如:Id212)。
- 越短越好;这些标识符必须尽可能短,因为它们必须由人输入。
- 它们不必是十六进制,所有字母和数字都可以
- 应该很容易被人类处理,但不是人类可读的(他们应该不做出任何类型的感觉)。
- 密码安全性,除了唯一性,不是问题
我考虑过这样做:
string <- c("this is obviously an amateur")
library(digest)
hash <- digest(object = string, algo = "crc32", serialize = FALSE)
导致 "ac32ed9d"。
我的问题是:
- 我可以使用整个字母表使这个字符串更短吗?
- 似乎有人担心
crc32
会导致冲突 – 比如说 500 个很长的句子会有问题吗?
- 一般来说,这是解决问题的合理方法吗?
我对R不熟悉,但我会尽量给出一般问题的答案。
通常,哈希码会根据给定范围内的给定字符串或对象 (o) 生成一个数字 [0..R]
。
N = hash(o,R)
您可以使用此数字生成一个短字符串,如下所示:
- 选择一系列字符(字母表)以供选择,例如
[A-Z,a-z,0-9]
。用 L 表示它的大小(例如 L=62)
- 计算 N 的 base-L 表示。我们得到一系列数字
a_1,...,a_k
,其中每个 a_i
是 [0 .. L-1] 中的一个数字
- 映射每个数字代表的字符:
0 -> A, 1 -> B, ..., 62 -> 9
您可以将生成的数字序列截断为您选择的长度 K。
可用序列的数量和冲突概率之间存在一个基本的权衡。当你使用一个好的散列函数时,你可以假设数字 N 在范围内均匀分布。当您选择了 L 个字符的字母表和 K 的序列长度时,碰撞概率为 (1/L)^K.
我有一组字符串需要转换为唯一的短标识符。
标识符应该是:
- 独一无二;不同的字符串产生相同的标识符应该非常不太可能
- 自动;我不想创建/硬编码手动标识符(如:Id212)。
- 越短越好;这些标识符必须尽可能短,因为它们必须由人输入。
- 它们不必是十六进制,所有字母和数字都可以
- 应该很容易被人类处理,但不是人类可读的(他们应该不做出任何类型的感觉)。
- 密码安全性,除了唯一性,不是问题
我考虑过这样做:
string <- c("this is obviously an amateur")
library(digest)
hash <- digest(object = string, algo = "crc32", serialize = FALSE)
导致 "ac32ed9d"。
我的问题是:
- 我可以使用整个字母表使这个字符串更短吗?
- 似乎有人担心
crc32
会导致冲突 – 比如说 500 个很长的句子会有问题吗? - 一般来说,这是解决问题的合理方法吗?
我对R不熟悉,但我会尽量给出一般问题的答案。
通常,哈希码会根据给定范围内的给定字符串或对象 (o) 生成一个数字 [0..R]
。
N = hash(o,R)
您可以使用此数字生成一个短字符串,如下所示:
- 选择一系列字符(字母表)以供选择,例如
[A-Z,a-z,0-9]
。用 L 表示它的大小(例如 L=62) - 计算 N 的 base-L 表示。我们得到一系列数字
a_1,...,a_k
,其中每个a_i
是 [0 .. L-1] 中的一个数字
- 映射每个数字代表的字符:
0 -> A, 1 -> B, ..., 62 -> 9
您可以将生成的数字序列截断为您选择的长度 K。
可用序列的数量和冲突概率之间存在一个基本的权衡。当你使用一个好的散列函数时,你可以假设数字 N 在范围内均匀分布。当您选择了 L 个字符的字母表和 K 的序列长度时,碰撞概率为 (1/L)^K.