将15个字符长度字符串转换为唯一的长数字 - 使用BigInteger longValue()

时间:2014-08-13 08:39:49

标签: java hadoop hive distinct base

我想将最大长度为15的字符串转换为唯一的长号。我试图使用BigInteger的longValue()函数。

BigInteger bigInt = new BigInteger("abcdeabcdeabcda".getBytes());
long n = bigInt.longValue();
  1. 我们可以避免长值的冲突直到15个字符串的字符串?
  2. 字符串可以包含包含特殊字符的字母数字。
  3. 不将字符串加密为长的想法。但要提高hive查询的count(不同)性能。
  4. 我们注意到,如果使用long而不是字符串,则hive中的count(distinct)会提供良好的性能。
  5. 我们不想要约。或概率统计不同。我们想要精确计数不同。
  6. 先谢谢

1 个答案:

答案 0 :(得分:0)

不,你不能 - 至少没有碰撞。

ASCII是每个字符7位和15 * 7 = 105位 - 你不能把它放到一个长的。

你建议你可能不需要完整的ASCII - 也许是64位而不是15 * 6 = 90,但仍然太长。

即使案例无关紧要,你可以在没有四个字母字符的情况下使用基数32,但仍然有15 * 5 = 75,这仍然是64位数字的错误。

您需要接受会发生碰撞,但也许有办法减少它们。你是如何生成这15个字符的字符串的?你有没有可以使用的模式?

问题selected answer @Athanor指出有一个好主意 - 使用两个长点。 2 * 64 = 128。使用7位ASCII的潜在105位数可以很好地适应两个长。