簡體   English   中英

根據任何給定的字符串生成整數(不含GetHashCode)

[英]Generate integer based on any given string (without GetHashCode)

我正在嘗試編寫一個方法來根據任何給定的字符串生成一個整數。 在2個相同的字符串上調用此方法時,我需要該方法兩次生成相同的完整整數。

我嘗試使用.GetHasCode()但是當我將項目移動到另一台機器時,這是非常不可靠的,因為GetHasCode()為同一個字符串返回不同的值

碰撞率非常低也很重要。 到目前為止我編寫的自定義方法僅在幾十萬個記錄之后產生沖突。

哈希值必須是整數。 字符串哈希值(如md5)會在速度和負載開銷方面削弱我的項目。

整數哈希用於執行非常快速的文本搜索,我工作得很漂亮,但是它當前依賴於.GetHasCode()並且在涉及多台機器時不起作用。

任何見解都將非常感激。

MD5哈希返回一個字節數組,可以轉換為整數:

var mystring = "abcd";
MD5 md5Hasher = MD5.Create();
var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(mystring));
var ivalue = BitConverter.ToInt32(hashed, 0);

當然,您正在從128位散列轉換為32位整數,因此一些信息正在丟失,這將增加沖突的可能性。 您可以嘗試將第二個參數調整為ToInt32以查看MD5哈希的任何特定范圍是否產生的沖突少於數據的其他范圍。

如果您的哈希代碼在“幾十萬條記錄之后”創建了重復項,那么您就擁有了非常好的哈希代碼實現。

如果你進行數學計算 ,你會發現32位哈希碼有大約50%的機會在大約70,000條記錄后創建一個副本。 在一百萬條記錄之后產生副本的可能性非常接近於確定無關緊要。

根據經驗,當散列的記錄數等於可能值數的平方根時,生成重復散列碼的可能性為50%。 因此,對於具有2 ^ 32個可能值的32位哈希碼,在大約2 ^ 16(65,536)個值之后生成重復的機會是50%。 實際數字略大 - 接近70,000 - 但經驗法則會讓你進入大球場。

另一個經驗法則是,當散列的項目數是平方根的四倍時,生成重復的幾率幾乎為100%。 因此,使用32位哈希碼,您幾乎可以保證在僅有2 ^ 18(262,144)個記錄散列后發生沖突。

如果使用MD5並將其從128位轉換為32位,則不會改變。

此代碼將任何字符串映射到0到100之間的int

int x= "ali".ToCharArray().Sum(x => x)%100;
using (MD5 md5 = MD5.Create())
{
    bigInteger = new BigInteger(md5.ComputeHash(Encoding.Default.GetBytes(myString)));
}

BigInteger需要Org.BouncyCastle.Math

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM