中方哈希是一种生成唯一密钥的哈希技术。在该技术中,采用种子值并将其平方。然后,从中间提取一些数字。这些提取的数字形成一个数字,该数字被当作新的种子。如果采用足够大的种子值,则此技术可以生成具有高随机性的密钥。但是,它具有局限性。由于种子是平方的,因此如果使用6位数字,则平方将为12位数字。这超出了int数据类型的范围。因此,必须注意溢出。如果发生溢出,请使用long long int数据类型;如果仍然发生溢出,则使用字符串作为乘法。在中间平方哈希中发生冲突的可能性很小,而不是过时。因此,如果发生冲突,可以使用一些哈希映射来处理。
范例:
Suppose a 4-digit seed is taken. seed = 4765
Hence, square of seed is = 4765 * 4765 = 22705225
Now, from this 8-digit number, any four digits are extracted (Say, the middle four).
So, the new seed value becomes seed = 7052
Now, square of this new seed is = 7052 * 7052 = 49730704
Again, the same set of 4-digits is extracted.
So, the new seed value becomes seed = 7307
.
.
.
.
This process is repeated as many times as a key is required.
中平方技术需要从一个数字的平方中提取一定数量的数字。提取的该数字是伪随机数,可用作散列的密钥。
算法:
- 选择一个种子值。这是重要的步骤,因为对于相同的种子值,将生成相同的随机数序列。
- 取种子值的平方,并用该平方中出现的一定数量的数字更新种子。注意:数字位数越大,随机性越大。
- 返回密钥。
下面是上述算法的实现:
// 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
注意:输出将根据日期和时间而变化。