根据字节数组生成静态范围的整数值

时间:2018-10-20 00:31:42

标签: c++ arrays

好吧,我相信这很奇怪,我完全不知道如何去做。

所以基本上我正在寻找一种基于给定的字节数组生成固定范围的整数值的方法。

说我有一个名为imALonleyArray的数组

unsigned char imALonleyArray[16] = {0x33, 0x7E, 0xD5, 0x8F, 0xC3, 0x01, 0x39, 0x0C, 0x5B, 0x0F, 0x80, 0x9C, 0x78, 0x90, 0x89, 0xF5};

我想基于上述数组以某种方式生成静态范围的整数值。

为什么您会问? 我需要根据可能的int_min到int_max分配一个固定的int值,或者实际上是基于给定用户16字节会话令牌为此程序(0-1487)分配的值。

示例:

int getIntRangeFromGivenBytes(unsigned char *arr, int minValue, int maxValue){
    /*Magic here that somehow computes then returns an int value between 
    minValue and maxValue based on the given bytes provided by the 'arr' argument*/  
}

我尽力描述我在这里要做的事情。我是新来的人,请不要枪me我。 预先感谢!

2 个答案:

答案 0 :(得分:0)

据我了解,您正在寻求一种算法,该算法针对给定的char数组,生成给定范围[a,b]内的整数,其中相同的整数将针对相同的输入弹出。

一个真正容易和简单的方法是将它们全部加在一起,并使用%模数使其进入范围。

int interval = maxValue - minValue;
int increment = 0;
for(int i = 0; i < array_size; ++i){
    increment += array[i];
    increment = increment % interval; // this ensures output is always within the interval
}

int final_answer = increment + a;

如果您想要一个可逆的产品,那就不一样了。坦率地说,如果数组的可能排列比间隔中的元素更多,那是不可能的。 (如果两个不同的数组映射到相同的整数,如何将其取反?)

例如,假设您的间隔为[0,5]。

unsigned char array[2] = {0x00, 0x00}; // assign to 0
unsigned char array[2] = {0x00, 0x01}; // assign to 1
unsigned char array[2] = {0x00, 0x02}; // assign to 2
unsigned char array[2] = {0x00, 0x03}; // assign to 3
unsigned char array[2] = {0x00, 0x04}; // assign to 4
unsigned char array[2] = {0x00, 0x05}; // assign to 5
unsigned char array[2] = {0x00, 0x06}; // now what?

因此,您需要确保间隔足够大,或将char数组的大小限制到足以避免冲突的范围。

边注:static一词的含义是C ++中非常特别的东西,因此您的问题有点令人困惑。

答案 1 :(得分:0)

您想要一个散列,而数字整数类型到某个范围的值的简单散列是除法:

uint64_t to_value(const uint8_t *array) {
  uint64_t result = array[0];
  for (int i = 1; i < 8; ++i)
    result = (result << 8) | array[i];
  return result;
}

uint64_t to_range(uint64_t input, uint64_t lower, uint64_t upper) {
  if (lower > upper)
    std::swap(upper, lower);
  if (upper == std::numeric_limits<uint64_t>::max() &&
      lower == std::numeric_limits<uint64_t>::min())
    return input;
  auto range = upper - lower + 1;
  return lower + ((input - lower) / range);
}

使用:

uint64_t my_hash(const uint8_t *data) {
  auto value = to_value(data);
  return to_range(value, 0, 1487);
}

这样的哈希值是否具有您未列出的其他属性是另一个故事。但是它满足您陈述的要求。