Это код, который я использовал (хеш-функция hashword ()), который на самом деле довольно просто, когда вы получаете вниз к нему.
Код:
#включают
#define u64 неподписанный долго долго
#define С64 (х) х ## ULL
U64 flipDiagA1H8 (u64 х) {
U64 т;
Const u64 k1 = С64 (0x5500550055005500);
Const u64 к2 = С64 (0x3333000033330000);
Const u64 K4 = С64 (0x0f0f0f0f00000000);
т = K4 & (Х ^ (х << 28));
х ^ = т ^ (т >> 28);
т = к2 & (Х ^ (х << 14));
х ^ = т ^ (т >> 14);
т = k1 & (Х ^ (х << 7));
х ^ = т ^ (т >> 7);
вернуться х;
}
U64 flipVertical (u64 х)
( (Икс << 24) & С64 (0x0000ff0000000000))
U64 hashword (u64 х)
{
// Состоящая из четырех частей
// Магнитно по антидиагональю
U64 x1 = flipDiagA1H8 (х);
// Отразить по вертикали
x1 = flipVertical (x1);
// XOR
х1 = х ^ x1;
// Добавить один
x1 ++;
вернуться x1;
}
Int основных ()
{
U64 вход = 0;
U64 выход = 0;
INT столкновения = 0;
(для ввода; < 0xFFFFFFF; вход ++) {
Выход = hashword (вход);
если (выход == вход) {
Е ("% D хэши к себе! \ П", Вход);
}
}
возвращать 0;
}
#define u64 неподписанный долго долго
#define С64 (х) х ## ULL
U64 flipDiagA1H8 (u64 х) {
U64 т;
Const u64 k1 = С64 (0x5500550055005500);
Const u64 к2 = С64 (0x3333000033330000);
Const u64 K4 = С64 (0x0f0f0f0f00000000);
т = K4 & (Х ^ (х << 28));
х ^ = т ^ (т >> 28);
т = к2 & (Х ^ (х << 14));
х ^ = т ^ (т >> 14);
т = k1 & (Х ^ (х << 7));
х ^ = т ^ (т >> 7);
вернуться х;
}
U64 flipVertical (u64 х)
( (Икс << 24) & С64 (0x0000ff0000000000))
U64 hashword (u64 х)
{
// Состоящая из четырех частей
// Магнитно по антидиагональю
U64 x1 = flipDiagA1H8 (х);
// Отразить по вертикали
x1 = flipVertical (x1);
// XOR
х1 = х ^ x1;
// Добавить один
x1 ++;
вернуться x1;
}
Int основных ()
{
U64 вход = 0;
U64 выход = 0;
INT столкновения = 0;
(для ввода; < 0xFFFFFFF; вход ++) {
Выход = hashword (вход);
если (выход == вход) {
Е ("% D хэши к себе! \ П", Вход);
}
}
возвращать 0;
}
У меня нет значительного количества Bitcoins предложить в качестве награды, но это может оказаться полезным в качестве небольшой проблемы.
Мэтью: из