Это было бы надежно для использования в качестве идентификатора для хранения данных (SQL Server)?
Я использовал бы гуид, но я предпочитаю числовое значение.
Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?
Нет. Идентификаторы GUID - 128-битные, а хэш-коды - 32-битные. Поэтому обязательно возникают столкновения. Маловероятно, что вы когда-нибудь столкнетесь с ним, но нет гарантии, что вы никогда с ним не встретитесь.
Для надежности вам нужна гарантия того, что вы никогда не столкнетесь с столкновениями. Если вы настаиваете на использовании Guid.NewGuid (). GetHashCode ()
, тогда вам необходимо добавить логику для обнаружения коллизий. У идентификаторов GUID есть преимущества (и недостатки), но без дополнительной информации я бы предложил использовать автоматически увеличивающийся столбец int
. Если вы говорите, что вам нужен числовой столбец, я бы предпочел использовать IDENTITY
.
Настоящий GUID должен быть уникальным. Когда вы уменьшаете это до int (через GetHashCode), вероятность его уникальности уменьшается.
Есть одна веская причина использовать GUID (уникальность), и этот код удаляет эту функцию GUID.
Если вам нужно числовое значение, используйте столбец IDENTITY
. Если вам нужен GUID, используйте уникальный идентификатор
. Просто как тот.
Не пытайтесь смешивать и сочетать. Не используйте хеширование GUID для получения числового значения. Это оставит вам все недостатки столбца GUID (большие данные / индексы, разбиение страниц), в то же время стимулируя большинство преимуществ (фактическая уникальность, поддержка репликации). Кроме того, вы не получаете ни одного из преимуществ, которые дает вам последовательный числовой идентификатор, таких как временное упорядочение и производительность индекса.
Dim bom As New Dictionary(Of Long, Boolean)
Sub pageload() Handles Me.Load
For i = 0 To 500
Dim act As New Action(AddressOf collisionfind)
act.BeginInvoke(Nothing, Nothing)
Next
End Sub
Sub collisionfind()
For index = 1 To 50000000
Dim INTGUID = Guid.NewGuid.GetHashCode / 2 * Guid.NewGuid.GetHashCode / 2
bom.Add(INTGUID, Nothing)
Next
End Sub
Ну, думаю, в конце концов, это почти так же хорошо.
Никаких коллизий :D.
50000000 Loops на 500 потоков - это довольно тяжело. Для меня этого достаточно.
Это распространенный подход, и я сразу назову одну вескую причину, по которой стоит пойти этим путем. Вы можете генерировать GUID до того, как попадете в БД, поэтому вы можете выполнить, скажем, вставку асинхронно и заранее знать, каким будет ID.
Убедитесь, что тип данных вашего первичного ключа - UNIQUEIDENTIFIER
, и все готово.
Я бы сказал, просто используйте GUID в качестве значения в столбце. Тогда никаких проблем.
A guid
с большей вероятностью представляет запись уникально, чем числовое значение
.
Наряду с:
См. это: Первичный ключ Guid или Int?