1) Не используйте хэш
У вас есть 9*6 = 54
отдельные лица на кубике Рубика. Даже расточительно используя 1 байт на лицевую сторону, это 432 бита, поэтому хеширование не сэкономит вам слишком много места. Лучшая упаковка из 3 битов на грани достигает 162 бит (21 байт). Для меня это звучит так, будто вам нужен компактный способ изобразить рубик.
OTOH, если вы хотите сохранить множество многих ранее посещенных состояний, я обнаружил, что использование фильтра Блума вместо истинного набора дает мне достойные результаты (но часто неоптимальные) с гораздо меньшим пространством использование.
2) Если вы женаты на идее хеширования:
Просто используйте MD5, он немного более компактен, чем предложенные состояния рубика, довольно быстр и обладает хорошими свойствами столкновения - это не то же самое, что злоумышленник, пытающийся вызвать столкновения хеша кубика рубика; -).
РЕДАКТИРОВАТЬ: Использование криптографических хеш-функций, таких как MD4 / MD5, обычно просто, если у вас есть библиотека или функция, реализующая алгоритм (например: OpenSSL, GNU TLS и многие автономные реализации существуют). Обычно это что-то вроде void md5(unsigned char *buf, size_t len, unsigned char *digest)
, где digest
указывает на предварительно выделенный 16-байтовый буфер, а buf
- это данные, которые должны быть хешированы (ваша структура кубика Рубика). Вот некоторый непроверенный код C:
#include <openssl/md5.h>
void main()
{
unsigned char digest[16];
unsigned char buf[BUFLEN];
initializeBuffer(buf);
MD5(buf,BUFLEN,digest); // This is the openssl function
printDigest(digest);
}
И обязательно скомпилируйте / свяжите с -lssl
.