为R中的字符串创建唯一的,人类可读的标识符(哈希?)

时间:2015-01-14 11:41:47

标签: r hash digest

我有一组字符串需要转换为唯一的短标识符。

标识符应为:

  • 独特;它应该非常不太可能不同的字符串导致相同的标识符
  • 自动;我不想创建/硬编码手册标识符(如:Id212)。
  • 尽可能短;这些标识符必须尽可能短,因为它们必须由人类输入。
  • 他们不必是十六进制,所有字母和数字都可以使用
  • 应该很容易被人类处理,但不是人类可读的(他们应该做出任何感觉)。
  • 除了唯一性之外,
  • 加密安全性不是一个问题

我想过这样做:

string <- c("this is obviously an amateur")
library(digest)
hash <- digest(object = string, algo = "crc32", serialize = FALSE)

导致&#34; ac32ed9d&#34;。

我的问题是:

  • 我可以使用整个字母来缩短此字符串吗?
  • 似乎有人担心crc32造成冲突 - 这会是一个问题吗,比方说500长句?
  • 这通常是解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:3)

我不熟悉R,但我会​​尝试回答一般问题。

通常,哈希码会在给定范围[0..R]内的给定字符串或对象(o)中生成一个数字。

N = hash(o,R)

您可以使用此数字生成短字符串,如下所示:

  1. 选择一系列字符(alphabeth)供您选择,例如: [A-Z,a-z,0-9]。用L表示其大小(例如L = 62)
  2. 计算N的基数L表示。我们得到一系列数字a_1,...,a_k,其中每个a_i是[0 .. L-1]中的数字
  3. 映射其代表字符的每个数字:0 -> A, 1 -> B, ..., 62 -> 9
  4. 您可以在您选择的长度K处截断结果数字序列。

    可用序列的数量与冲突概率之间存在基本权衡。当您使用良好的散列函数时,您可以假设数字N在该范围内均匀分布。当您选择L个字符的字母并且序列长度为K时,碰撞概率为(1 / L)^ K。