📜  中方哈希

📅  最后修改于: 2021-05-04 21:08:28             🧑  作者: Mango

中方哈希是一种生成唯一密钥的哈希技术。在该技术中,采用种子值并将其平方。然后,从中间提取一些数字。这些提取的数字形成一个数字,该数字被当作新的种子。如果采用足够大的种子值,则此技术可以生成具有高随机性的密钥。但是,它具有局限性。由于种子是平方的,因此如果使用6位数字,则平方将为12位数字。这超出了int数据类型的范围。因此,必须注意溢出。如果发生溢出,请使用long long int数据类型;如果仍然发生溢出,则使用字符串作为乘法。在中间平方哈希中发生冲突的可能性很小,而不是过时。因此,如果发生冲突,可以使用一些哈希映射来处理。

范例

中平方技术需要从一个数字的平方中提取一定数量的数字。提取的该数字是伪随机数,可用作散列的密钥。

算法:

  1. 选择一个种子值。这是重要的步骤,因为对于相同的种子值,将生成相同的随机数序列。
  2. 取种子值的平方,并用该平方中出现的一定数量的数字更新种子。注意:数字位数越大,随机性越大。
  3. 返回密钥。

下面是上述算法的实现:

// C++ program to illustrate the
// mid-square hashing technique
#include 
#include 
  
using namespace std;
  
// Returns a seed value based on current system time.
long long int newTime()
{
  
    // Acquiring number of seconds
    // passed from Jan 1, 1970.
    time_t t = time(NULL);
  
    // Converting the time to year, month,
    // day, hour, minute, and second.
    struct tm* tm = localtime(&t);
    long long int x;
  
    // Applying a certain logic to get
    // required number of digits. It may vary.
    x = (tm->tm_hour) * 10000000 + (tm->tm_min) * 100000
        + (tm->tm_sec) * 1000 + (tm->tm_mday) * 10 + (tm->tm_year);
  
    // Return the calculated number.
    return x;
}
  
// Returns a random 8-digit key.
long int getKey()
{
  
    // Taking the key from system time. 
    // returns a  8-digit seed value.
    static long long int key = newTime();
  
    // Squaring the key.
    key = key * key;
  
    // Extracting required number of digits ( here, 8 ).
    if (key < 1000000000000000) {
        key = key / 10000;
        key = key % 100000000;
    }
    else {
        key = key / 10000;
        key = key % 100000000;
    }
  
    // Returning the key value.
    return key;
}
  
// Driver Code
int main()
{
    // get the first key
    std::cout << getKey() << endl;
  
    // get the second key
    std::cout << getKey() << endl;
    return 0;
}
输出:
56002270
25424515

注意:输出将根据日期和时间而变化。