2012-06-24 59 views
0

我想在C中實現散列技術,其中字符串的所有排列都具有相同的散列鍵。
例如abc & cab兩者應該具有相同的密鑰。字符串散列函數C

我曾經想過加入ascii值&然後檢查frequency of characters [重要,否則既abc & aad將有哪些我們不希望同樣的鍵]的。
但是,它似乎不是很有效。

有沒有更好的散列函數可以很好地解決衝突&也不會導致稀疏散列表?

Java內部使用哪種散列技術[for strings],這不僅使衝突最小化,而且操作[insertion ,deletion, search]速度足夠快?

+0

這裏有一個[類似的問題](http://stackoverflow.com/questions/1536393/good-hash-function-for-permutations),可能會啓發你... –

回答

4

顯而易見的技術是簡單地對字符串進行排序。您可以簡單地使用已排序的字符串作爲查找鍵,或者您可以使用任何適當的算法對其進行哈希處理。或者你可以使用你的字符串的運行長度編碼(RLE)表示(所以banana的RLE將是a3bn2),並且可以選擇對其進行散列。

很大程度上取決於你將如何處理哈希,以及它們必須如何抵抗碰撞。一個簡單的CRC(循環冗餘校驗和)可能就足夠了,或者可能是加密校驗和(如MD5或SHA1)對您來說不夠安全。

+0

+1表示散列的_use_是重要的,並且這可以改變解決方案。 –

12

爲什麼不在散列之前對字符串的字符進行排序?

+0

如果字符串是幾兆字節長? –

+2

任何處理都將至少爲O(n)時間。在O(nlogn)時間和O(n)空間中排序應該是可能的。根據性能要求,這些增加可能太多,但他們似乎並不瘋狂。 –

+1

@Tony,David:實際上,一個字符串可以在O(n)時間(計數排序)中排序。 –

2

的哈希技術是Java內部使用的字符串]這 不僅最大限度地減少了碰撞,而且操作[插入 ,刪除,搜索]足夠快?

在Java中使用速度基本的「絕招」是哈希值使其成爲String的成員變量的緩存,所以你只計算一次。但這隻能在Java中工作,因爲字符串是不可變的

1

關於哈希的主要規則是「不要發明自己的哈希算法。」。您可以對字符串中的字符進行排序並應用標準哈希策略。

也讀that如果你有興趣哈希。

+1

對於一個絕對正確的安全立場,但是你不會發現任何安全的散列算法會爲排列產生相同的散列。這就是algogeek正在尋找的! – Sascha